При программировании с помощью tkinter я обнаружил очень странное поведение виджета Checkbutton. Я воссоздал ошибку с помощью следующего кода:
import tkinter
from tkinter import *
def displayWelcomeScreen(root):
root2 = Toplevel(root)
root2.geometry('600x380')
root2.focus_set()
Checked = IntVar()
CheckButton1 = Checkbutton(root2, variable=Checked)
CheckButton1.place(relx=0.5, rely=0.5, anchor=CENTER)
CheckButton1.select()
# Create a dummy button that makes the Checkbutton appear checked to the user
#Button(root2, command= lambda event: Checked.get())
root = Tk()
root.geometry('700x400')
displayWelcomeScreen(root)
root.mainloop()
Когда новое окно создается с помощью Toplevel(root)
, и я помещаю в него контрольную кнопку, он не отображается для пользователя, хотя я используйте метод .select()
.
Однако, когда я создаю фиктивную кнопку, команда которой упоминает IntVar, связанную с моей Checkbutton, каким-то образом она инициализируется как проверенная должным образом. Это похоже на то, как если бы компилятор проверял, будет ли полезна кнопка Checkbutton, и на основе этого решает, будет ли она отображать ее как выбранную или нет. * до и после команды CheckButton1.select()
значение изменяется, оно просто не отображается для пользователя.
Кто-нибудь знает, почему это происходит?
РЕДАКТИРОВАТЬ 2: Благодаря jasonharper's объяснение, я добавил строку CheckButton1.intvar = Checked
, и она работала без необходимости в фиктивной кнопке. Когда функция вышла за пределы области видимости, переменная Checked была потеряна, поэтому Checkbutton некуда было сохранить свое состояние, поэтому нам нужно было сохранить ссылку на нее, чтобы она не исчезла.