【问题标题】:How to define variable for checkbox and use that variable to find value of checked or unchecked?如何为复选框定义变量并使用该变量来查找选中或未选中的值?
【发布时间】:2019-07-26 10:46:59
【问题描述】:

我有一个列列表colList = ['A','B','C','D'],它与复选框一起显示给用户,用户选中复选框并单击提交按钮。在提交时,我只想获取检查值的列。

我正在使用 Tkinter,网格结构。

代码如下。

from tkinter import filedialog
from tkinter import *
import tkinter as tk


def command_to_extract():
    print('Extract button pressed')

#this function will display which checkbox is checked and display the column name - But I am not able to write the check condition for checking the value of checkbox

root = Tk()

button3 = Button(text="Extract", command=command_to_extract, width=30, anchor=NW)
button3.grid(row=4, column=4)

lbl31 = Label(master=root, text="Select the column(s) for output csv file", width=30, anchor=NW)
lbl31.grid(row=5, column=2)

colList = ['A','B','C','D']

columnDictionary = { i : colList[i] for i in range(0, len(colList) ) } # To Make a dictionary from a List

p = 0 #variable for column

#this double for loop for 2X2 display of checkbox

for i in range(0, 2): #row      
    for j in range(0, 2): #column
        Checkbutton(master=root, text = colList[p], variable = var[], onvalue = 1, offvalue = 0, width=40, anchor=NW).grid(row = i, column = j)

        p = p + 1

mainloop()

当我只需要选择几个复选框时,就会出现问题,然后如何区分一个复选框与另一个复选框。我还需要获取列名,例如weither variable = var[] 以使用或其他方式。请帮帮我。

【问题讨论】:

  • Checkbutton 返回一个对象。使用变量或列表来存储对象以供进一步操作。祝你好运!
  • 您可以将name 参数添加到您的复选框(name="unique_name"),然后只需检查名称。
  • for loop 中的 variable = var[] 在 HTML 中无法正常工作
  • @Ardweaden Name 参数是否可以在Checkbutton() 中使用?在 python tkinter 中
  • @SANTOSHKUMARDESAI 请解释一下,因为我是 python 新手

标签: python tkinter


【解决方案1】:
from functools import partial

optionsticked = []
def callback(name):
    if name in optionsticked:
        optionsticked.remove(name)
        optionsticked.sort()
        print(optionsticked)
        return
    optionsticked.append(name)
    optionsticked.sort()
    print(optionsticked)

for i in range(0, 2): #row
    for j in range(0, 2): #column
        name = colList[p]
        Checkbutton(master=root, text = name, onvalue = 1, offvalue = 0, width=40, anchor=NW, command = partial(callback,name) ).grid(row = i, column = j)
        p += 1

mainloop()

所以这里我刚刚使用了 checkbutton 的命令函数,这样当它检测到按下 checkbutton 时,它会将按钮的名称传递给回调函数,回调函数将按钮附加到列表中。如果按钮未选中,则将其删除。这应该适用于您希望的任意数量的按钮,您所要做的就是将该列表的值导出到 csv。

我在 for 循环中添加了按钮的名称作为显式变量,以便可以将其传递给函数,并且还导入了 functools.partial 以将变量传递给回调函数。

另一个小的变化是删除了 variable = var[] 部分,因为这似乎没有做任何事情。

希望这是你问的问题!

【讨论】:

  • 它给出了partial()NameError: name 'partial' is not defined的错误
  • 在下面的文字中,我说过要从 functools 导入部分内容,但我已将其添加到答案中以使其更清晰。对歧义感到抱歉!它现在应该可以工作了。
  • 如果我们尝试有一个按钮,通过全选选中所有复选框,该怎么做?还是设置为默认选中?
  • 是否有任何 id 可以分配给我们访问的复选框,以便在单击全选按钮时选中所有复选框。
  • 我不太明白,但你必须进行重组。将按钮放入列表/字典中,然后将单击命令设置为循环遍历该列表的函数。然后循环将在每个按钮上调用 i.select。这会检查每个按钮,但会绕过我的初始方法。然后,您必须找到一种方法来通过查看每个按钮的特定 IntVar(1 或 0)来识别按钮是否被按下。我下面的答案可能会在这方面做得很好,但它的代码肯定需要重组。我建议打开另一个问题。
【解决方案2】:

最简单的解决方案是将变量存储在字典中。

vars = {}
for row in range(0, 2):      
    for column in range(0, 2):
        vars[(row,column)] = IntVar()
        Checkbutton(..., variable=vars[(row,column)], ...)

然后您可以使用vars[(row, column)] 访问每一行和每一列的复选按钮。

def command_to_extract():
    print('Extract button pressed')
    for row in range(0,2):
        for column in range(0,2):
            var = vars[(row, column)]
            print("{},{}: {}".format(row, column, var.get())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    相关资源
    最近更新 更多