TKinter中小部件的组合事件处理

0 投票
2 回答
579 浏览
提问于 2025-04-16 07:02

我正在用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 个回答

0

就像彼得·米利说的那样,command 选项需要一个函数的引用(也就是说:给它一个函数的 名字,不要加括号)。不要试图把代码写在一起,应该创建一个单独的函数。这样你的代码会更容易理解和维护。

1

你现在把 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 的函数。

撰写回答