(Un) Функция проверки всех флажков для нескольких наборов кнопок - PullRequest
0 голосов
/ 06 июля 2018

У меня есть графический интерфейс, использующий tkinter, который имеет несколько групп флажков. Каждая группа контрольных кнопок состоит из списка контрольных кнопок, который соответствует списку tk.IntVar () для каждой контрольной кнопки. Таким образом, для группы контрольных кнопок «Альфа» cbAlpha[3] является одним примером контрольной кнопки, а cbAlphaVar[3] является ее соответствующей функцией tk.IntVar (). Каждая отдельная группа контрольных кнопок имеет свою собственную (не) флажок Check-All, который выбирает / отменяет выбор всех контрольных кнопок этой группы одновременно. Каждая из этих (Не) флажков Check-All имеет свою индивидуальную функцию (вызывается командой checkbutton).

Мое желание состоит в том, чтобы иметь единственную функцию (которую можно вызывать с помощью команды checkbutton) или, по крайней мере, упрощенную лямбду, которую можно использовать для проверки / снятия отметки со всех кнопок checkbutton в данной группе.

Как правило, у меня есть функция, которая принимает список (из tk.IntVar () s) в качестве аргумента и просто включает / выключает каждый элемент этого списка. Но я не могу указать аргумент в команде checkbutton, и поэтому у каждого есть своя собственная функция ... Что приводит к избыточному коду. Мне не удалось зафиксировать структуру, которая позволяет мне использовать только одну функцию или, по крайней мере, отдельную лямбду в команде.

Итак, для упрощенного примера, скажем, у меня есть две группы кнопок: Альфа и Браво. У меня есть список tk.Checkbutton () в alphaCbs[] и соответствующий список tk.IntVar () в alphaCbVars[]. То же самое для bravoCbs[] и bravoCbVars[]. Альфа-группа имеет (Не) 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())

И у меня есть аналогичная функция для Браво ... и Чарли ... и Дельта ... и т. Д. Так что излишне избыточно. Любые предложения относительно объединения в одну функцию или лямбда в команде? Спасибо!

1 Ответ

0 голосов
/ 06 июля 2018

Насколько я понимаю, проблема в том, что вам нужно написать несколько таких функций:

def allAlpha():
     for eachVar in alphaCbVars:
          eachVar.set(allAlphaVar.get())

def allBravo():
     for eachVar in bravoCbVars:
          eachVar.set(allBravoVar.get())

… и т. Д.

Вам нужна функция, которая принимает список переменных и 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')

Или, в качестве альтернативы, может быть, просто функция для группировки нескольких 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 и т. Д. Как отдельные переменные. Может быть, более разумно иметь список групп, или точное наложение имен на группы, или какой-то объект с атрибутами, или ... что угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...