Python (tkinter)获得哪些复选按钮被选中?



我试图建立一个python应用程序,我们可以使我们的工作时间表。我希望能够按2复选按钮每名员工,并导出那些签入CSV文件。我现在设置代码的方式是我在循环中生成Checkbuttons,所以我不能给它们单独的名称/值。我还能看到哪些键被按下了吗?

变量"time "包含所有可用时间的列表,从14:00开始到23:00结束)

#building UI
master = Tk()
emplindex = 1
timeindex = 1
for i in times:
timelabel = Label(master, text=" " + i + " ").grid(row=0, column=timeindex)
timeindex +=1
for i in employees:
namelabel = Label(master, text=i[1]).grid(row=emplindex, column=0)
timeindex = 1
for i in times:
CB =  Checkbutton(master).grid(row=emplindex,column=timeindex)
timeindex +=1
emplindex +=1
buildbutton = ttk.Button(master, text = "BUILD SCHEDULE", command=lambda: buttonclicked()).grid(row=100)
def buttonclicked():
selected = CB
master.mainloop()

这是ui的输出

您需要将变量与复选按钮关联,并将对按钮的引用保存在列表或字典中。然后,您可以遍历变量以确定检查了哪些变量。

这里有一个简单的例子来说明这一点:

import tkinter as tk
def submit():
for i, var in enumerate(cbvars):
print(f"{i}: {var.get()}")
root = tk.Tk()
cbvars = []
for i in range(10):
var = tk.IntVar(root, value=0)
cbvars.append(var)
cb = tk.Checkbutton(root, text=f"Item #{i}", variable=var)
cb.pack(side="top", anchor="w")
button = tk.Button(root, text="Submit", command=submit)
button.pack()
root.mainloop()

您可以:

1:将Checkbuttons存储在数组中并获取状态

2:将一个函数作为命令传递给checkbutton,得到其中的emplindextimeindexcheckbutton被打勾

CB=Checkbutton(master,command=lambda:checked(emplindex,timeindex)
def checked(emplindex,timeindex):
#whatever...

您可以使用字典以员工名称作为键来存储与复选按钮相关的所有变量,然后您可以使用此字典的变量列表生成您想要的CSV文件。

也可以使用Checkbuttoncommand选项来限制在命令回调中选中按钮的数量最多为两个。

import tkinter as tk
from tkinter import ttk
import csv
def on_check(varlist, var):
count = sum(v.get() for v in varlist)
if count > 2:
# at most two check buttons can be checked
var.set(0)
times = [
'14:00', '14:30',
'15:00', '15:30',
'16:00', '16:30',
'17:00', '17:30',
'18:00', '18:30',
'19:00', '19:30',
'20:00', '20:30',
'21:00', '21:30',
'22:00', '22:30',
'23:00',
]
employees = ['niek', 'jeroen', 'veronica']
master = tk.Tk()
# time slot headings
for col, slot in enumerate(times, 1):
tk.Label(master, text=slot).grid(row=0, column=col)
cblist = {}  # dictionary to store variable list with employee name as key
for row, name in enumerate(employees, 1):
tk.Label(master, text=name).grid(row=row, column=0)
varlist = []
for col, slot in enumerate(times, 1):
var = tk.IntVar(value=0)
cb = tk.Checkbutton(master, variable=var, command=lambda l=varlist, v=var: on_check(l, v))
cb.grid(row=row, column=col)
varlist.append(var)
cblist[name] = varlist
def button_clicked():
with open('schedule.csv', 'w', newline='') as f:
writer = csv.writer(f)
for name, varlist in cblist.items():
row = name, *[slot for slot,var in zip(times,varlist) if var.get() == 1]
writer.writerow(row)
ttk.Button(master, text='BUILD SCHEDULE', command=button_clicked).grid(row=100)
master.mainloop()

最新更新