Tkinter:OptionMenu导致“ NoneType”跟踪错误

时间:2019-10-29 07:24:21

标签: python tkinter optionmenu

因此,我尝试使用OptionMenu在窗口上绘制的项目列表之间进行切换。我可以通过跟踪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示例的地步,并且我 still 遇到了相同的错误。

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”的情况下,回调函数执行一次,但是即使我尝试将其更改回“ A”,使用OptionMenu更改var也会引发TypeError。我至今看不到是什么原因导致了代码被精简到这一点。 Tkinter中的OptionMenu函数不再起作用了吗?

1 个答案:

答案 0 :(得分:0)

尝试一下。

在跟踪中调用函数时,应仅按其名称调用函数。但是,在跟踪中,它将三个参数传递给函数(您不需要它们来达到目的:有关详细信息,请参见What are the arguments to Tkinter variable trace method callbacks?)。因此,您可以定义一个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()

这两种方法都应该起作用。