循环中创建的 Tkinter 复选框



我正在做我的第一个Tkinter项目,并使用了几个stackoverflow答案和解释(以及它们指向的其他链接(作为尝试理解如何构建我的应用程序的基础。

在阅读了这个问题(以及接受答案中的大多数链接(后,我构建了我的应用程序: 在 tkinter 中的两个帧之间切换

在我的一个帧中,我需要使用 for 循环创建复选框。 我发现这个页面很有帮助:如何在python tkinter的for循环中从列表中创建多个复选框

我很难在默认情况下最初选中所有复选框(我想要的行为(。

我的代码的相关部分如下(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:如果有办法默认选中复选框?

我已经围绕这个主题研究了许多不同的问题,但仍然无法得出正确的答案。 有人可以指出我正确的方向吗?

您的问题是self.run_filefor循环的每次迭代中都被覆盖。要确保每个复选框的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()

最新更新