我的tkinter应用程序有几个控件,我想知道它们何时发生任何更改,以便我可以更新应用程序的其他部分。
除了编写一个更新程序并在结尾处循环运行之外,还有什么方法吗?
root.after(0, updaterfunction)
这种方法过去曾经奏效,但如果需要检查的内容很多,可能会变得昂贵。
即使我使用这种方法,我能否通过仅更新具有更改变量的项来节省资源?如果可以,请分享如何实现,因为我不确定如何在更新函数之外检测特定的更改。
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变量类来存储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")
Python Tkinter的变量是一个可观察的对象,可以用于将GUI小部件与应用程序中的数据建立联系。有三种类型的变量:IntVar、DoubleVar和StringVar。创建变量时,可以给它们赋初值。当变量的值发生变化时,可以绑定回调函数以响应这些变化。变量的值可以通过 get() 方法获得,也可以使用 set() 方法设置新值。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()
optionMenu.bind("<Configure>", optionMenuChanged)
- saeedgnuOptionMenu_SelectionEvent
的参数不是事件对象,而只是当前选择的字符串之外,不幸的是。@saeedgnu我不建议使用.bind('<Configure>'
;因为这仅适用于OptionMenu在选择某些选项时通常会更改大小,当在具有相同宽度的选项之间进行更改时,它将失败。 - Durganevent
返回所选项目的文本。如果 OP 想要跟踪项目的索引,例如,需要额外的步骤来查找 options
中的字符串并返回其索引。这绝不是完美的,因为理论上这样的菜单可以具有一个或多个相同的值。在实践中没有意义,但如果例如菜单是从配置文件中填充的值,则可能会发生。所有这些意味着需要自定义选项菜单或完全自定义小部件。对于大多数情况,获取所选项目的字符串就足够了。 - rbaleksandar这将把下拉选择打印到控制台。但我的建议是在基于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()