Python (Un)检查多组检查按钮的所有检查按钮功能
我有一个GUI,使用tkinter,它有多组复选按钮。每组checkbutton都由一个checkbutton列表组成,该列表对应于每个checkbutton的tk.IntVar()列表。也就是说,对于checkbutton组“Alpha”,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
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,我们就从那里开始。