如何检测OptionMenu或Checkbutton的变化?

14 投票
4 回答
32936 浏览
提问于 2025-04-16 13:43

我有一个用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 的 OptionMenuCheckbutton 中的变量,你可以使用它的 trace() 方法。

trace() 的作用就是监控这个变量,当它被读取或者写入的时候。

trace() 方法需要两个参数 - 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

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)

想了解更多关于传递给回调函数的参数的信息,可以查看 这个回答

撰写回答