我正在创建一个窗口,其中的一个复选框中有4个选项(在Python中使用Tkinter)。 我希望每当您单击一个选项时,其他选项更改状态都被禁用。我看到了一个他们在其中使用的帖子:
root = Tk()
def click():
check.config(state=DISABLED)
check = Checkbutton(text="Click Me", command=click)
check.grid()
root.mainloop()
但是,在我的程序中,我有几个窗口,并且位于第三个窗口中。当我创建 def 来禁用未选中的检查按钮时,出现一个错误,提示我的检查按钮未定义,这是重要的代码部分:
budget1 = IntVar()
budget2 = IntVar()
budget3 = IntVar()
budget4 = IntVar()
window3 = Toplevel()
window3.config(bg="lightgreen")
window3.title("My details")
window3.resizable(1, 1)
secondary_font=("Arial 20 bold")
check_3box = Frame(window3, bg="lightgreen")
check_3box.grid(column=0, row=7)
W9_W3 = Checkbutton(check_3box, text="$0-$300", variable=budget1, bg="white", fg="black", command=budget_disable(1))
W9_W3.grid(column=0,row=7, padx=15, pady=1)
W10_W3 = Checkbutton(check_3box, text="$300-500", variable=budget2, bg="white", fg="black", command=budget_disable(2))
W10_W3.grid(column=1, row=7, padx=15, pady=1)
W11_W3 = Checkbutton(check_3box, text="$500-$900", variable=budget3, bg="white", fg="black", command=budget_disable(3))
W11_W3.grid(column=2, row=7, padx=15, pady=1)
W12_W3 = Checkbutton(check_3box, text="$900+",variable=budget4, bg="white", fg="black", command=budget_disable(4))
W12_W3.grid(column=3, row=7, padx=15, pady=1)
我在代码开头就有了这个定义
def budget_disable(a):
if a == 1:
W10_W3.config(state=DISABLED)
W11_W3.config(state=DISABLED)
W12_W3.config(sate=DISABLED)
if a == 2:
W9_W3.config(state=DISABLED)
W11_W3.config(state=DISABLED)
W12_W3.config(sate=DISABLED)
if a == 3:
W9_W3.config(state=DISABLED)
W10_W3.config(state=DISABLED)
W12_W3.config(sate=DISABLED)
if a == 4:
W9_W3.config(state=DISABLED)
W10_W3.config(state=DISABLED)
W11_W3.config(state=DISABLED)
出现的错误是
NameError: name 'W10_W3' is not defined
答案 0 :(得分:-1)
解决方案是将您的Checkbutton分配语句更改为:
W9_W3 = Checkbutton(check_3box, text="$0-$300", bg="white", fg="black", command= lambda: budget_disable(1))
应将命令参数传递给函数的名称,即。 budget_disable,而不是调用函数。 budget_disable(),否则在创建检查按钮时调用该函数,因此在创建其他检查按钮之前便已运行该函数。但是,如果您想将参数传递给函数(就像您一样),则可以使用lambda创建一个函数,该函数使用参数来调用函数。
我希望我的解释有意义:)