TKinter中小部件的组合事件处理
我正在用Tkinter制作一个图形界面程序,但遇到了一些问题。我想做的是画两个复选框和一个按钮。根据用户的输入,接下来应该执行不同的步骤。下面是我代码的一部分:
CheckVar1 = IntVar()
CheckVar2 = IntVar()
self.C1 = Checkbutton(root, text = "C Classifier", variable = CheckVar1, onvalue = 1, offvalue = 0, height=5,width = 20).grid(row=4)
self.C2 = Checkbutton(root, text = "GClassifier", variable = CheckVar2, onvalue = 1, offvalue = 0, height=5, width = 20).grid(row=5)
self.proceed1 = Button(root,text = "\n Proceed",command = self.proceed(CheckVar1.get(),CheckVar2.get())).grid(row=6)
# where proceed prints the combined values of 2 checkboxes
我遇到的错误很常见,就是两个选中的复选框的默认值会被打印出来,然后就没有后续的输入了。错误信息是“NullType对象不可调用”。
我在网上查了一下,觉得这个问题可能和lambda事件或者柯里化有关。
请帮帮我……
2 个回答
就像彼得·米利说的那样,command
选项需要一个函数的引用(也就是说:给它一个函数的 名字,不要加括号)。不要试图把代码写在一起,应该创建一个单独的函数。这样你的代码会更容易理解和维护。
你现在把 self.proceed(CheckVar1.get(),CheckVar2.get())
的结果传给了 Button
的构造函数,但你其实想要的是把 command
设置为一个 函数,这个函数每次按钮被按下时都会调用 self.proceed(CheckVar1.get(),CheckVar2.get())
,并返回一个新的、可能不同的值。你可以用一个 lambda 表达式,或者用一个简单的回调函数来解决这个问题。比如,把最后一行替换成:
def callback():
return self.proceed(CheckVar1.get(), CheckVar2.get())
self.proceed1 = Button(root, text="\n Proceed", command=callback).grid(row=6)
这在 Tkinter 中是很常见的。记住:当你在 Tkinter 中看到一个叫 command
的变量时,它是需要一个 函数,而不是一个值。
补充说明:为了更清楚,你之所以会看到 'NullType Object is not callable' 的错误,是因为你把 command
设置成了 self.proceed
的一次调用的返回值(这个返回值是 NullType 对象)。self.proceed
是一个函数,但它的返回值不是。你需要做的是把 command
设置成一个可以调用 self.proceed
的函数。