【问题标题】:Tkinter checkboxes created in loop在循环中创建的 Tkinter 复选框
【发布时间】:2018-01-01 00:16:07
【问题描述】:

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

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

【问题讨论】:

    标签: python for-loop checkbox tkinter


    【解决方案1】:

    您的问题是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()
    

    【讨论】:

    • 完全有道理。谢谢,就像一个魅力。 Kinda 觉得这就是正在发生的事情,但甚至没有考虑将其列入清单。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多