循环创建的Tkinter复选框

时间:2017-07-25 21:42:32

标签: python for-loop checkbox tkinter

我正在开发我的第一个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?

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

1 个答案:

答案 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()