【发布时间】:2020-02-11 06:34:37
【问题描述】:
我的代码包含两个条目小部件,它们应该保存图像的高度和宽度。 当用户在两个小部件之一中输入数字调整高度或宽度时,另一个的值应该根据输入的值和固定的纵横比进行调整。
我的第一种方法是将更新函数绑定到按键事件,但我遇到了导致绑定函数在文本变量更改之前执行的错误。此处描述了该问题:Tkinter, update Entry widget before calling <Key> binding。建议的解决方案是使用变量跟踪而不是按键事件绑定。但是,由于在我的情况下,一个变量的更改会执行一个更改另一个变量的函数,所以我希望这些函数在无限循环中相互执行。这不会发生,但绝对不会产生预期的结果。
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 中的 * 替换为 /
【问题讨论】:
-
所以这个设置的问题是这两个函数都会被调用。因为当调用一个或另一个时,您正在编辑另一个。这也会触发另一个呼叫。
标签: python tkinter tkinter-entry