【问题标题】:(Un)Check-all checkbutton function for multiple sets of checkbuttons(Un)多组勾选按钮的Check-all勾选按钮功能
【发布时间】:2018-07-05 22:34:35
【问题描述】:

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

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

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

举个简单的例子,假设我有两组检查按钮:Alpha 和 Bravo。我在alphaCbs[] 中有 tk.Checkbutton() 列表,在 alphaCbVars[] 中有相应的 tk.IntVar() 列表。 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 的任何建议? 谢谢!

【问题讨论】:

标签: python python-3.x tkinter


【解决方案1】:

据我了解,问题是你必须编写一堆这样的函数:

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)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2013-05-28
    • 2020-02-23
    • 1970-01-01
    相关资源
    最近更新 更多