我有一个使用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的任何建议? 谢谢!
答案 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)
也许您甚至不想将alphaCbVars
,betaCbVars
等存储为单独的变量。拥有组列表,将名称映射到组的dict或具有属性的某种对象,或者……不管,也许更有意义。