如何检测 OptionMenu 或 Checkbutton 何时更改?

问题描述 投票:0回答:5

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

除了编写更新器函数并在最后循环:

之外,我还能做些什么吗?
root.after(0, updaterfunction) 

这个方法过去确实有效,但如果要检查的东西很多,恐怕会很贵。

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

python widget tkinter
5个回答
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)

有关传递给回调的参数的更多信息,请参阅此答案


9
投票

如果您使用像

StringVar()
这样的 Tkinter Variable 类来将变量存储在 Tkinter
OptionMenu
Checkbutton
中,则可以使用其
trace()
方法。

trace()
,基本上,在读取或写入变量时监视变量。

trace()
方法需要 2 个参数 -
mode
function callback

trace(mode, callback)

  • 模式参数是“r”(当某人读取变量时调用观察者)、“w”(当某人写入变量时调用)或“u”(取消定义;当变量被删除时调用)之一。
  • 回调参数是变量更改时要对函数进行的调用。

这就是它的用法 -

def callback(*args):
    print("variable changed!")

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

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


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()

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()

0
投票

如果您需要检查复选框的状态并执行某些操作,只需向其添加一个函数,该函数将通过

get()
进行检查。使用自定义 tkinter 的示例(通常情况下,小部件的另一个名称):

...
def check():
    check=checkbox.get()
    if check==1:
        print("on")
    if check==0:
        print("off")

checkbox=CTkCheckBox(command=check)
...
© www.soinside.com 2019 - 2024. All rights reserved.