Отключение Checkbutton из вторичного окна - Tkinter - PullRequest
0 голосов
/ 26 апреля 2020

Я создаю окно, в котором у вас есть 4 опции в кнопке (используя Tkinter в Python). Я sh, что всякий раз, когда вы нажимаете одну опцию, другие меняют состояние, деактивируются. Я видел сообщение, в котором они использовали это:

root = Tk()
def click():
    check.config(state=DISABLED)
check = Checkbutton(text="Click Me", command=click)
check.grid()
root.mainloop()

Однако в моей программе у меня есть несколько windows, и я нахожусь в третьем окне. И когда я делаю 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 прямо в начале кода

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 голосов
/ 26 апреля 2020

Решение состоит в том, чтобы изменить операторы присваивания флажков на:

W9_W3 = Checkbutton(check_3box, text="$0-$300", bg="white", fg="black", command= lambda: budget_disable(1))

В аргументе команды должно быть передано имя функции ie. budget_disable вместо вызова функции ie. budget_disable (), в противном случае функция вызывается при создании кнопки и функция запускается до того, как вы сделали другие кнопки. Однако, если вы хотите передать аргумент функции (как вы это делаете), вы можете использовать лямбду для создания функции, которая вызывает вашу функцию с аргументом.

Надеюсь, мое объяснение имеет смысл:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...