(Un)用于多组复选按钮的全选复选按钮功能

时间:2018-07-05 22:34:36

标签: python python-3.x tkinter

我有一个使用tkinter的GUI,它具有多组复选按钮。每组复选按钮均包含复选按钮列表,该列表与每个复选按钮的tk.IntVar()列表相对应。也就是说,对于复选按钮组“ Alpha”,cbAlpha[3]是复选按钮的一个示例,而cbAlphaVar[3]是其对应的tk.IntVar()。 每个单独的复选按钮组都有自己的(Un)Check-All复选按钮,可以一次选择/取消选择该组复选按钮中的所有复选按钮。这些(Un)Check-All所有检查按钮都有其自己的单独功能(由其checkbutton命令调用)。

我的愿望是只有一个功能(可以通过checkbutton命令调用),或者至少是一个简化的lambda,可以用来检查/取消选中给定组中的所有checkbutton。

通常,我会有一个函数,该函数将一个列表(tk.IntVar()s)作为参数,并仅打开/关闭该列表的每个元素。但是我不能在checkbutton命令中指定一个参数,因此每个参数都有其自己的功能...这将导致冗余代码。我无法确定一种结构,该结构仅允许我使用单个功能,或者至少要在命令中使用一个独立的lambda。

因此,举一个简化的例子,假设我有两组检查按钮:Alpha和Bravo。我在alphaCbs[]中有tk.Checkbutton()列表,在alphaCbVars[]中有相应的tk.IntVar()s列表。 bravoCbs[]bravoCbVars[]相同。 Alpha组具有(Un)Check-All复选框,如下所示:

allAlphaCbVar = tk.IntVar() allAlphaCb = tk.Checkbutton(root, text='Alpha', variable=allAlphaCbVar, command=allAlpha) 具有相应的功能:

def allAlpha(): for eachVar in alphaCbVars: eachVar.set(allAlphaVar.get())

我对Bravo ...和Charlie ...和Delta ...等也有类似的功能。因此不必要地多余了。关于在命令中合并为单个函数或lambda的任何建议? 谢谢!

1 个答案:

答案 0 :(得分:2)

据我了解,问题在于您必须编写一堆这样的函数:

def allAlpha():
     for eachVar in alphaCbVars:
          eachVar.set(allAlphaVar.get())

def allBravo():
     for eachVar in bravoCbVars:
          eachVar.set(allBravoVar.get())

…等等。

您想要的是一个将var列表和all-var作为参数的函数:

def allGroup(listOfVars, groupVar):
     for eachVar in listOfVars:
          eachVar.set(groupVar.get())

现在,您可以使用partial创建所有单独的部分函数:

from functools import partial

allAlphaCb = tk.Checkbutton(root, text='Alpha', variable=allAlphaCbVar,
                            command=partial(allGroup, alphaCbVars, allAlphaVar)
allBetaCb = tk.Checkbutton(root, text='Beta', variable=allBetaCbVar,
                            command=partial(allGroup, betaCbVars, allBetaVar)

但是,您可以编写一个函数来完成所有工作,以在一个地方建立一个小组,从而进一步减少重复。很难证明没有更多的代码可以使用,但是看起来像这样:

def makeGroup(name): # maybe some more params needed for the individual cbs
    allCbVars = []
    allCbs = []
    # some loop that generates the individual variables and checkboxes
    # and puts them in those lists
    cbVar = tk.IntVar()
    cb = tk.Checkbutton(root, text=name, variable=cbVar, 
                        command=partial(allGroup, allCbVars)
    return allCbVars, allCbs, cbVar, cb

alphaCbVars, alphaCbs, allAlphaVar, allAlphaCb = makeGroup('Alpha')

或者,或者,可能只是将一堆cb组合在一起的函数:

def groupify(name, cbVars):
    cbVar = tk.IntVar()
    cb = tk.Checkbutton(root, text=name, variable=cbVar, 
                        command=partial(allGroup, cbVars)
    return cbVar, cb

# now build all your individual alpha cbs the same as in your current code

alphaCbVar, alphaCb = groupify('Alpha', alphaCbVars)

也许您甚至不想将alphaCbVarsbetaCbVars等存储为单独的变量。拥有组列表,将名称映射到组的dict或具有属性的某种对象,或者……不管,也许更有意义。