tkinter:为什么默认情况下我的复选框没有被选中?
tkinter: Why aren't my checkboxes checked by default?
我有使用户能够编辑对象的功能,其中一部分是创建新的 window,其中每个变量的复选框中都有条目,默认情况下应该具有之前输入的变量值,但是我无法将我的复选框设置为默认选中。
现在我正在尝试默认选中所有复选框(我认为如果这会起作用,很少有 if
语句不会更改它,我将有适当的解决方案来解决我的问题)。
这是我与这些复选框相关的代码片段:
from tkinter import *
def editonclick():
persons = ['User 1', 'User 2', 'User 3']
person_labels = []
person_checkboxes = []
checkbox_var = []
new_window = Toplevel()
for person in persons:
checkbox_var.append(IntVar(value=1))
person_labels.append(Label(new_window, text=person))
person_checkboxes.append(Checkbutton(new_window, variable=checkbox_var[-1]))
for i in range(len(persons)):
person_labels[i].grid(row=i, column=0)
person_checkboxes[i].grid(row=i, column=1)
root = Tk()
editonclick()
mainloop()
我尝试将默认设置 checkbox_var
设置为 IntVar(value=1)
在将其附加到列表并在创建它后选择复选框后将其值设置为 1 并且 none 它有效,但是当我还像这样打印 checkbox_var
的状态:
尝试:
from tkinter import *
def editonclick():
persons = ['User 1', 'User 2', 'User 3']
person_labels = []
person_checkboxes = []
checkbox_var = []
new_window = Toplevel()
for person in persons:
checkbox_var.append(IntVar(value=1))
person_labels.append(Label(new_window, text=person))
print(checkbox_var[-1].get())
person_checkboxes.append(Checkbutton(new_window, variable=checkbox_var[-1]))
print(checkbox_var[-1].get())
for i in range(len(persons)):
person_labels[i].grid(row=i, column=0)
person_checkboxes[i].grid(row=i, column=1)
root = Tk()
editonclick()
mainloop()
即使输出是:
1
1
None 个复选框已选中。
所以问题是我可以做些什么来默认选中这些复选框?
编辑:
我认为上面的代码是解决我的问题的 MRE,在编写它时我意识到当函数代码之外的代码工作正常时。
也试过添加 onvalue=1
和 offvalue=0
,但还是不行。
问题是您的 IntVar
实例是局部变量。当它们超出范围时,它们就失去了价值。
一个简单的解决方法是在 editionclick
.
中添加 global checkbox_var
问题是 checkbox_var 是一个局部变量,它正在收集 carbage。
你可以试试:
self.checkbox_var = []
person_checkboxes.append(Checkbutton(new_window, variable=self.checkbox_var[-1]))
我有使用户能够编辑对象的功能,其中一部分是创建新的 window,其中每个变量的复选框中都有条目,默认情况下应该具有之前输入的变量值,但是我无法将我的复选框设置为默认选中。
现在我正在尝试默认选中所有复选框(我认为如果这会起作用,很少有 if
语句不会更改它,我将有适当的解决方案来解决我的问题)。
这是我与这些复选框相关的代码片段:
from tkinter import *
def editonclick():
persons = ['User 1', 'User 2', 'User 3']
person_labels = []
person_checkboxes = []
checkbox_var = []
new_window = Toplevel()
for person in persons:
checkbox_var.append(IntVar(value=1))
person_labels.append(Label(new_window, text=person))
person_checkboxes.append(Checkbutton(new_window, variable=checkbox_var[-1]))
for i in range(len(persons)):
person_labels[i].grid(row=i, column=0)
person_checkboxes[i].grid(row=i, column=1)
root = Tk()
editonclick()
mainloop()
我尝试将默认设置 checkbox_var
设置为 IntVar(value=1)
在将其附加到列表并在创建它后选择复选框后将其值设置为 1 并且 none 它有效,但是当我还像这样打印 checkbox_var
的状态:
尝试:
from tkinter import *
def editonclick():
persons = ['User 1', 'User 2', 'User 3']
person_labels = []
person_checkboxes = []
checkbox_var = []
new_window = Toplevel()
for person in persons:
checkbox_var.append(IntVar(value=1))
person_labels.append(Label(new_window, text=person))
print(checkbox_var[-1].get())
person_checkboxes.append(Checkbutton(new_window, variable=checkbox_var[-1]))
print(checkbox_var[-1].get())
for i in range(len(persons)):
person_labels[i].grid(row=i, column=0)
person_checkboxes[i].grid(row=i, column=1)
root = Tk()
editonclick()
mainloop()
即使输出是:
1
1
None 个复选框已选中。
所以问题是我可以做些什么来默认选中这些复选框?
编辑: 我认为上面的代码是解决我的问题的 MRE,在编写它时我意识到当函数代码之外的代码工作正常时。
也试过添加 onvalue=1
和 offvalue=0
,但还是不行。
问题是您的 IntVar
实例是局部变量。当它们超出范围时,它们就失去了价值。
一个简单的解决方法是在 editionclick
.
global checkbox_var
问题是 checkbox_var 是一个局部变量,它正在收集 carbage。
你可以试试:
self.checkbox_var = []
person_checkboxes.append(Checkbutton(new_window, variable=self.checkbox_var[-1]))