Tkinter:OptionMenu 导致 'NoneType' 跟踪错误

Tkinter: OptionMenu causing 'NoneType' trace error

所以我尝试使用 OptionMenu 在 window 上绘制的项目列表之间切换。我可以通过跟踪 OptionMenu 的变量并在跟踪回调函数中处理绘图来做到这一点。当代码第一次使用变量的默认值执行时,这一切都很好地工作。但是,一旦我使用 OptionMenu 进行选择,我就会收到此错误:

    Exception in Tkinter callback
    Traceback (most recent call last):
  File "C:\Users\NotActuallyMyRealName\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
TypeError: 'NoneType' object is not callable

我已将问题缩小到 OptionMenu 和跟踪回调。我实际上将脚本精简到基本上是 Tkinter 文档中的 OptionMenu 示例的程度,我 仍然 得到同样的错误。

from tkinter import *
root = Tk()

def callback():
    print("var:" + var.get())

var = StringVar()
var.set("A")
var.trace("w", callback())
op = OptionMenu(root, var, "A", "B", "C")
op.pack()

root.mainloop()

同样,回调函数确实在默认变量设置为 "A" 的情况下执行一次,但是使用 OptionMenu 更改变量会引发 TypeError,即使我尝试将其更改回 "A" .到目前为止,我看不出是什么原因导致了这种情况。 Tkinter 中的 OptionMenu 功能是否不再有效?

试试这个。

当你在跟踪中调用一个函数时,你应该只通过它的名字来调用函数。然而,在跟踪中,它将三个参数传递给函数(您不需要它们用于您的目的:有关详细信息,请参阅 )。所以你可以定义一个 lambda 函数来拥有 3 个虚拟参数并调用你的回调函数。

from tkinter import *
root = Tk()

def callback():
    print("var:" + var.get())

var = StringVar()
var.set("A")
var.trace("w", lambda x,y,z: callback())
op = OptionMenu(root, var, "A", "B", "C")
op.pack()

root.mainloop()

或者您也可以使用三个虚拟参数定义回调函数:

from tkinter import *
root = Tk()

def callback(a,b,c):
    print("var:" + var.get())

var = StringVar()
var.set("A")
var.trace("w", callback)
op = OptionMenu(root, var, "A", "B", "C")
op.pack()

root.mainloop()

两种方法都应该有效。