我正在开发我的第一个Tkinter项目,并使用了几个stackoverflow答案和解释(以及它们导致的其他链接)作为尝试了解如何构建我的应用程序的基础。
我在阅读完这个问题(以及接受的答案中的大部分链接)后构建了我的应用程序:Switch between two frames in tkinter
在我的一个框架中,我需要使用for循环创建复选框。我发现此页面很有用:How do I create multiple checkboxes from a list in a for loop in python tkinter
我很难在默认情况下检查所有复选框(我想要的行为)。
我的代码的相关部分如下(python2.7):
import Tkinter as tk
class Main(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
...
## gets set on a different frame in the application
self.files_list = []
class A(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
...
## self.f_list contains the values (a list of dictionaries) that I am expecting on this frame
self.f_list = controller.files_list
for f in self.f_list:
self.file_name = tk.StringVar()
self.file_name.set(f['file'])
self.run_file = tk.IntVar()
self.run_file.set(1)
cb = tk.Checkbutton(self, text=self.file_name.get(), variable=self.run_file)
cb.pack()
这会生成我希望的“文件名”列表,每个列表都有一个复选框。但是,运行时只会检查循环中生成的最后一个复选框。
在调用pack方法之前,我先输入一个print语句来打印self.run_file.get(),每次循环都打印一个值为1。
我尝试用几种不同的方式改变循环:
## same behavior
self.run_file = tk.Variable()
self.run_file.set(1)
## same behavior
self.run_file = tk.IntVar(value=1)
## no checkboxes set
cb = tk.Checkbutton(self, text=self.file_name.get(), variable=self.run_file.get())
我觉得因为每次循环时self.file_name的值都不同,所以没有问题。由于默认情况下会检查最后一个复选框,因此我觉得该值在前一个复选框中丢失,但我不知道如何构造我的复选框或self.run_file变量,以便默认选中每个复选框。在阅读完这个问题之后,我在for循环中使用self:Python, Tkinter : if there a way to check checkboxes by default?
我已经围绕这个主题看了很多不同的问题,但仍然无法得出正确的答案。有人能指出我正确的方向吗?
答案 0 :(得分:0)
您的问题是self.run_file
循环中的每次迭代都会覆盖for
。要确保不会覆盖每个复选框的IntVar
,请将它们单独存储,例如在列表中:
self.run_file_IntVars = []
for i, f in enumerate(self.f_list):
self.run_file_IntVars.append(tk.IntVar(value=1))
cb = tk.Checkbutton(self, text=f['file'],
variable=self.run_file_IntVars[i])
cb.pack()