如何检测OptionMenu或Checkbutton的变化?
我有一个用tkinter做的应用程序,里面有很多控件。我想知道这些控件什么时候发生了变化,这样我就可以更新应用程序的其他部分。
有没有什么办法可以做到这一点,而不需要写一个更新函数,然后在最后用:
root.after(0, updaterfunction)
这个方法以前是有效的,但我担心如果需要检查的东西很多,这样做会很耗资源。
即使我使用这个方法,我能否通过只更新那些有变化的项目来节省资源?如果可以的话,请告诉我怎么做,因为我不太确定如何在更新函数之外检测具体的变化。
4 个回答
8
要在选择某个选项时触发一个事件,你需要为OptionMenu设置命令选项。
例如:
def OptionMenu_SelectionEvent(event): # I'm not sure on the arguments here, it works though
## do something
pass
var = StringVar()
var.set("one")
options = ["one", "two", "three"]
OptionMenu(frame, var, *(options), command = OptionMenu_SelectionEvent).pack()
9
如果你在使用 Tkinter 的变量类,比如 StringVar()
来存储你在 Tkinter 的 OptionMenu
或 Checkbutton
中的变量,你可以使用它的 trace()
方法。
trace()
的作用就是监控这个变量,当它被读取或者写入的时候。
trace()
方法需要两个参数 - mode
和 function callback
。
trace(mode, callback)
- mode 参数可以是 “r” (当变量被读取时调用观察者)、“w” (当变量被写入时调用)、或者 “u” (未定义;当变量被删除时调用)。
- callback 参数是你希望在变量发生变化时调用的函数。
这就是它的用法 -
def callback(*args):
print("variable changed!")
var = StringVar()
var.trace("w", callback)
var.set("hello")
21
很多tkinter控件可以和一个变量关联起来。对于这些控件,你可以在变量上设置一个监视,这样每当变量发生变化时,就会自动调用某个函数。
举个例子:
在下面的例子中,无论变量是怎么改变的,只要一变化,回调函数就会被调用。
def callback(*args):
print(f"the variable has changed to '{var.get()}'")
root = tk.Tk()
var = tk.StringVar(value="one")
var.trace("w", callback)
想了解更多关于传递给回调函数的参数的信息,可以查看 这个回答