【问题标题】:Python (tkinter) getting which checkbuttons are checked?Python(tkinter)获取检查了哪些检查按钮?
【发布时间】:2021-08-31 11:47:53
【问题描述】:

我正在尝试构建一个 python 应用程序,我们可以在其中制定工作时间表。我希望能够为每位员工按下 2 个复选按钮,并将已签入的复选按钮导出到 CSV 文件中。我现在设置代码的方式是在 for 循环中生成 Checkbuttons,所以我不能给它们单独的名称/值。还有办法让我看到哪些被按下了吗?

(变量“times”包含所有可用时间的列表,从 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()

This is what the ui outputs

【问题讨论】:

    标签: python tkinter checkbox


    【解决方案1】:

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

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

    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()
    

    【讨论】:

      【解决方案2】:

      你可以:

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

      或者

      2:将函数作为命令传递给checkbutton 并获取emplindex timeindex checkbutton 的标记

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

      【讨论】:

      • 您希望他们如何获得答案第一部分的状态?
      • @Bryan Oakley 如果使用 ttk 而不是 checkbutton.state() 获取状态 如果不是,那么您的答案就是这样做的方法
      【解决方案3】:

      您可以使用dictionary以员工姓名为key来存储与checkbuttons相关的所有变量,然后您可以使用这个变量列表字典生成您想要的CSV文件。 p>

      您还可以使用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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-14
        • 1970-01-01
        • 2015-09-16
        • 1970-01-01
        • 2018-04-27
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多