我有一个使用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的任何建议?
谢谢!

最佳答案

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

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或某种带有属性的对象,或者……什么都更有意义。

关于python - (取消)多组复选按钮的全选复选按钮功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51200744/

10-16 22:54