我有一个使用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)
也许您甚至不想将
alphaCbVars
,betaCbVars
等存储为单独的变量。也许有一个组列表,一个将名称映射到组的dict或某种带有属性的对象,或者……什么都更有意义。关于python - (取消)多组复选按钮的全选复选按钮功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51200744/