我的代码包含两个条目小部件,它们应该保存图像的高度和宽度。 当用户在两个小部件之一中输入数字来调整高度或宽度时,另一个的值应该根据输入的值和固定的纵横比进行调整。
我的第一个方法是将更新函数绑定(bind)到按键事件,但我遇到了导致在更改文本变量之前执行绑定(bind)函数的错误。此处描述了该问题:Tkinter, update Entry widget before calling <Key> binding .建议的解决方案是使用变量跟踪而不是按键事件绑定(bind)。但是,由于在我的例子中,一个变量的更改会执行一个更改另一个变量的函数,因此我希望这些函数在无限循环中相互执行。这不会发生,但肯定不会产生预期的结果。
import tkinter as tk
import tkinter.ttk as ttk
class App:
def __init__(self, master, aspect_ratio):
self.master = master
self.aspect_ratio = aspect_ratio
self.shape_x = tk.DoubleVar()
self.shape_y = tk.DoubleVar()
self.shape_x.trace('w', self.update_y)
self.shape_y.trace('w', self.update_x)
# Entry for x dimension
self.entry_x = ttk.Entry(self.master, textvariable=self.shape_x, width=5)
self.entry_x.pack(side='left', fill='x', expand='yes')
# Label for multiplication sign
self.entry_label = tk.Label(self.master, text='x', fg='gray')
self.entry_label.pack(side='left')
# Entry for y dimension
self.entry_y = ttk.Entry(self.master, textvariable=self.shape_y, width=5)
self.entry_y.pack(side='left', fill='x', expand='yes')
def update_x(self, *args):
self.shape_x.set(self.shape_y.get() * self.aspect_ratio)
def update_y(self, *args):
self.shape_y.set(self.shape_x.get() / self.aspect_ratio)
if __name__ == '__main__':
root = tk.Tk()
app = App(master=root, aspect_ratio=2)
root.mainloop()
实现我所寻找的目标的正确方法是什么?
编辑:将 update_y 中的 * 替换为/
最佳答案
可以说,最简单的解决方案是绑定(bind) <KeyRelease>
事件,因为修改发生在按键按下上。这样,您就不需要使用 textvariable
的开销了。属性。
self.entry_x.bind("<Any-KeyRelease>", self.update_y)
self.entry_y.bind("<Any-KeyRelease>", self.update_x)
关于python - 基于另一个条目小部件的内容更新条目小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58380092/