从辅助窗口禁用检查按钮-Tkinter

时间:2020-04-25 23:05:16

标签: python user-interface tkinter

我正在创建一个窗口,其中的一个复选框中有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

1 个答案:

答案 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创建一个函数,该函数使用参数来调用函数。

我希望我的解释有意义:)