我的 tkinter 应用程序有多个控件,我想知道它们何时发生任何更改,以便我可以更新应用程序的其他部分。
除了编写更新器函数并在最后循环:
之外,我还能做些什么吗?root.after(0, updaterfunction)
这个方法过去确实有效,但如果要检查的东西很多,恐怕会很贵。
即使我确实使用了这种方法,我可以通过仅更新具有更改的变量的项目来节省资源吗?如果是这样,请分享如何,因为我不确定如何检测更新功能之外的特定更改。
许多 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)
有关传递给回调的参数的更多信息,请参阅此答案
如果您使用像
StringVar()
这样的 Tkinter Variable 类来将变量存储在 Tkinter OptionMenu
或 Checkbutton
中,则可以使用其 trace()
方法。
trace()
,基本上,在读取或写入变量时监视变量。
trace()
方法需要 2 个参数 - mode
和 function callback
。
trace(mode, callback)
这就是它的用法 -
def callback(*args):
print("variable changed!")
var = StringVar()
var.trace("w", callback)
var.set("hello")
要在进行选择时触发事件,请设置 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()
这会将下拉选择打印到控制台。但我的建议是避免在基于 GUI 的应用程序中使用控制台。创建一个文本指示器并向其打印输出
使用下面代码中的函数
from tkinter import *
tk = Tk()
def OptionMenu_SelectionEvent(event):
print(var.get())
pass
var = StringVar(); var.set("one")
options = ["one", "two", "three"]
OptionMenu(tk, var, *(options), command = OptionMenu_SelectionEvent).pack()
tk.mainloop()
如果您需要检查复选框的状态并执行某些操作,只需向其添加一个函数,该函数将通过
get()
进行检查。使用自定义 tkinter 的示例(通常情况下,小部件的另一个名称):
...
def check():
check=checkbox.get()
if check==1:
print("on")
if check==0:
print("off")
checkbox=CTkCheckBox(command=check)
...