Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python (Un)检查多组检查按钮的所有检查按钮功能_Python_Python 3.x_Tkinter - Fatal编程技术网

Python (Un)检查多组检查按钮的所有检查按钮功能

Python (Un)检查多组检查按钮的所有检查按钮功能,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我有一个GUI,使用tkinter,它有多组复选按钮。每组checkbutton都由一个checkbutton列表组成,该列表对应于每个checkbutton的tk.IntVar()列表。也就是说,对于checkbutton组“Alpha”,cbAlpha[3]是checkbutton的一个示例,cbAlphaVar[3]是其对应的tk.IntVar()。 每个单独的checkbutton组都有自己的(取消)Check All checkbutton,可同时选择/取消选择该组的所有checkbu

我有一个GUI,使用tkinter,它有多组复选按钮。每组checkbutton都由一个checkbutton列表组成,该列表对应于每个checkbutton的tk.IntVar()列表。也就是说,对于checkbutton组“Alpha”,
cbAlpha[3]
是checkbutton的一个示例,
cbAlphaVar[3]
是其对应的tk.IntVar()。 每个单独的checkbutton组都有自己的(取消)Check All checkbutton,可同时选择/取消选择该组的所有checkbutton。每个(取消)Check All checkbutton都有自己的单独功能(由其checkbutton命令调用)

我希望有一个单一的函数(可以通过checkbutton命令调用),或者至少有一个简化的lambda,可以用来选中/取消选中给定组中的所有checkbutton

一般来说,我会有一个函数,它将一个列表(tk.IntVar()s)作为参数,只打开/关闭该列表的每个元素。但我不能在checkbutton命令中指定参数,因此每个参数都有自己的函数。。。这会导致冗余代码。我还不能确定一个结构,允许我只使用一个函数,或者至少在命令中使用一个自包含的lambda

举个简单的例子,假设我有两组复选按钮:Alpha和Bravo。我在
alphaCbs[]
中有tk.Checkbutton()的列表,在
alphaCbVars[]
中有相应的tk.IntVar()的列表。对于
bravoCbs[]
bravoCbVars[]
也一样。Alpha组有一个(取消)检查所有检查按钮,如下所示:

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

def allAlpha():
对于字母CBVAR中的每个HVAR:
eachVar.set(allAlphaVar.get())

我对Bravo有一个类似的函数。。。查理。。。和三角洲。。。如此多余。关于在命令中组合成单个函数或lambda,有什么建议吗?
谢谢

据我所知,问题是您必须编写一系列函数,如下所示:

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

def allBravo():
     for eachVar in bravoCbVars:
          eachVar.set(allBravoVar.get())
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')
……等等

您需要的是一个函数,它将变量列表和所有变量作为参数:

def allGroup(listOfVars, groupVar):
     for eachVar in listOfVars:
          eachVar.set(groupVar.get())
现在,您可以使用创建所有单独的分部函数:

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 allAlpha():
     for eachVar in alphaCbVars:
          eachVar.set(allAlphaVar.get())

def allBravo():
     for eachVar in bravoCbVars:
          eachVar.set(allBravoVar.get())
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')
或者,也可以只使用一个函数将一组cbs组合在一起:

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)

也许你甚至不想把
alphaCbVars
betaCbVars
等存储为单独的变量。也许有一个组列表,或者将名称映射到组的dict,或者某种具有属性的对象,或者……诸如此类更有意义。

听起来你需要一个类。给我们看看a,我们就从那里开始。