gpt4 book ai didi

python - (Un)多组复选按钮的全选复选按钮功能

转载 作者:行者123 更新时间:2023-12-01 01:47:06 25 4
gpt4 key购买 nike

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

我的愿望是拥有一个函数(可以通过 checkbutton 命令调用),或者至少是一个简化的 lambda,可用于检查/取消选中给定组中的所有检查按钮。

一般来说,我会有一个函数,它接受一个列表(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():
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())

...等等。

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

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')

或者,也许只是一个将一堆 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)

也许您甚至不想将 alphaCbVarsbetaCbVars 等存储为单独的变量。也许拥有一个组列表,或者一个将名称映射到组的字典,或者某种具有属性的对象,或者......等等,更有意义。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com