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,因此“打开”。这个函数有两个参数:index
和 task
。该索引旨在从 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
被打包。
如果您有任何问题,请提出。
有用的资源:
我正在用列表 task_list = []
.
任务是 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,因此“打开”。这个函数有两个参数:index
和 task
。该索引旨在从 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
被打包。
如果您有任何问题,请提出。
有用的资源: