【发布时间】: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