Python Tkinter:从列表创建复选按钮

Python Tkinter: Creating checkbuttons from a list

我正在用列表 task_list = [].

在 tkinter 中构建一个图形用户界面

任务是 to/deleted 从 gui 列表中追加的。

我想要一个 window,列表中的每个项目都有复选框。

所以如果列表中有 10 个项目,那么也应该有 10 个复选框。 如果列表中有 5 个项目,则应该有 5 个相应的复选框。

能做到吗?

我在上面找不到任何东西

谢谢!

这里。

from tkinter import *
task_list=["Call","Work","Help"]
root=Tk()
Label(root,text="My Tasks").place(x=5,y=0)
placement=20
for tasks in task_list:
    Checkbutton(root,text=str(tasks)).place(x=5,y=placement)
    placement+=20
root.mainloop()

使用网格。

from tkinter import *
task_list=["Call","Work","Help"]
root=Tk()
Label(root,text="My Tasks").grid(row=0,column=0)
placement=3
for tasks in task_list:
    Checkbutton(root,text=str(tasks)).grid(row=placement,column=0,sticky="w")
    placement+=3
root.mainloop()

这是我针对此问题的代码:

from tkinter import Tk, Checkbutton, IntVar, Frame, Label
from functools import partial

task_list = ['Task 1', 'Task 2', 'Task 3', 'Work', 'Study']


def choose(index, task):
    print(f'Selected task: {task}' if var_list[index].get() == 1 else f'Unselected task: {task}')


root = Tk()

Label(root, text='Tasks').grid(column=0, row=0)

frame = Frame(root)
frame.grid(column=0, row=1)

var_list = []

for index, task in enumerate(task_list):
    var_list.append(IntVar(value=0))
    Checkbutton(frame, variable=var_list[index],
                text=task, command=partial(choose, index, task)).pack()

root.mainloop()

首先我想提一下,可以像本例中那样混合使用布局管理器方法。主要的 window 使用 grid 作为布局管理方法,我已经将框架网格化到 window,但请注意 Checkbuttons 正在打包,这是因为框架是不同的容器,因此可以使用不同的布局管理器,在这种情况下会更容易,因为 pack 只是将这些检查按钮一个接一个地放置。

其他内容:
有包含任务的任务列表。

然后我定义了一个函数choose()这个函数打印出一些东西。这取决于一个变量。比较是这样发生的:如果值是这个就打印出来,否则打印出来。它只是一行中的 if/else 语句,它检查的只是该特定索引中该列表中的 IntVar 是否为值 1,因此“打开”。这个函数有两个参数:indextask。该索引旨在从 var_list 中获取相应的 IntVar,而 task 旨在显示已选择或未选择的任务。

最后就是简单的root = Tk()root.mainloop()

然后是刚刚说明的标签

然后是框架和这里您可以看到标签和框架都使用 .grid()

进行了网格化

然后 var_list = [] 只是创建一个空列表。

然后循环:
它遍历 task_list 中的每个项目并提取列表中该项目的索引和值本身。这是通过使用 enumerate() 函数完成的。

每次迭代都会将 IntVar(value=0) 附加到 var_list 并且由于此附加发生在从 task_list 读取项目的同时 IntVar ] 在列表中与 task_list 中的当前项目相同,因此可以使用相同的索引进行访问。

然后创建了一个Checkbutton,它的主人是frame(这样就可以使用.pack())和text=task 所以它对应于任务名称,变量通过索引设置为 var_list 中的特定项目,这一切都必须完成,以便保留对 IntVar 的引用。然后是 command=partial(choose, index, task),这可能看起来令人困惑,但所有 partial 所做的基本上是这个函数现在将始终使用刚刚给定的变量执行,因此对于这个 Checkbutton 的这个函数,这些变量将始终相同。 partial 的第一个参数是要执行的函数,接下来是该函数接收的参数。然后 Checkbutton 被打包。

如果您有任何问题,请提出。

有用的资源: