如何检测OptionMenu或Checkbutton的更改?

14

我的tkinter应用程序有几个控件,我想知道它们何时发生任何更改,以便我可以更新应用程序的其他部分。

除了编写一个更新程序并在结尾处循环运行之外,还有什么方法吗?

root.after(0, updaterfunction) 

这种方法过去曾经奏效,但如果需要检查的内容很多,可能会变得昂贵。

即使我使用这种方法,我能否通过仅更新具有更改变量的项来节省资源?如果可以,请分享如何实现,因为我不确定如何在更新函数之外检测特定的更改。

4个回答

20
许多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)

要了解传递给回调函数的参数的更多信息,请参见此答案


URL不再有效。 - Okym

9
如果您正在使用像StringVar()这样的Tkinter变量类来存储Tkinter OptionMenuCheckbutton中的变量,您可以使用它的trace()方法。
基本上,trace()在变量被读取或写入时对其进行监视。 trace()方法接受2个参数 - modefunction callback

trace(mode, callback)

  • mode参数是“r”(当有人读取变量时调用观察者)、“w”(当有人写入变量时调用)或“u”(未定义;当删除变量时调用)之一。
  • callback参数是您希望在变量更改时调用该函数的调用。
下面是使用示例:
def callback(*args):
    print("variable changed!")

var = StringVar()
var.trace("w", callback)
var.set("hello")

来源:https://dafarry.github.io/tkinterbook/variable.htm

Python Tkinter的变量是一个可观察的对象,可以用于将GUI小部件与应用程序中的数据建立联系。有三种类型的变量:IntVar、DoubleVar和StringVar。创建变量时,可以给它们赋初值。当变量的值发生变化时,可以绑定回调函数以响应这些变化。变量的值可以通过 get() 方法获得,也可以使用 set() 方法设置新值。

8
要在选择时触发事件,请为OptionMenu设置command选项。
示例:
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()

3
OptionMenu不能像按钮对象那样与一个执行其他函数的命令连接。OptionMenu基本上只允许用户将某个变量设置为预定义列表(即OptionMenu的菜单项),如果你在上面放置“command = xxx”,它不会触发其他操作。要在更改所选选项时触发操作,需要像Bryan上面所述的那样使用跟踪(trace)。 - Korzak
1
另一种方法: optionMenu.bind("<Configure>", optionMenuChanged) - saeedgnu
@Korzak 你真的试过吗?我使用它时是有效的。请注意,它必须在选项元组之后出现。也许这在 Python 2 和 3 中有所不同... 还要注意的是,它不会向被调用的函数发送事件,而是发送它设置变量的字符串值。 - Perkins
除了OptionMenu_SelectionEvent的参数不是事件对象,而只是当前选择的字符串之外,不幸的是。@saeedgnu我不建议使用.bind('<Configure>';因为这仅适用于OptionMenu在选择某些选项时通常会更改大小,当在具有相同宽度的选项之间进行更改时,它将失败。 - Durgan
1
event 返回所选项目的文本。如果 OP 想要跟踪项目的索引,例如,需要额外的步骤来查找 options 中的字符串并返回其索引。这绝不是完美的,因为理论上这样的菜单可以具有一个或多个相同的值。在实践中没有意义,但如果例如菜单是从配置文件中填充的值,则可能会发生。所有这些意味着需要自定义选项菜单或完全自定义小部件。对于大多数情况,获取所选项目的字符串就足够了。 - rbaleksandar
这比其他答案中的跟踪方法更容易,并且具有同等的功能。 - Marijn

0

这将把下拉选择打印到控制台。但我的建议是在基于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()

复制整个代码并重试,它可以正常工作且命令参数也是正确的 @BlackJack - Vignesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接