Как привязать ключ возврата к нескольким кнопкам tkinter - PullRequest
0 голосов
/ 26 февраля 2020

Я проектирую Tkinter GUI, в котором используются кнопки-флажки для отображения доступных последовательных портов в системе. Пользователь сможет проверить, к каким портам он хочет подключиться, и должен сделать это, либо щелкнув по нужным флажкам, либо перейдя к каждой кнопке Checking, нажав клавишу Tab и затем нажав клавишу Return, чтобы выбрать / отмените выбор каждого, кого они хотят. Я столкнулся с ошибкой. Все работает, кроме навигации по вкладкам. При навигации по полям моего GUI с помощью клавиши Tab, когда я нажимаю клавишу Tab, чтобы перейти к COM1 (слева), и нажимаю клавишу ввода, он только включает и выключает COM3. Затем, когда я снова нажму клавишу Tab, чтобы перейти к COM3 (справа), COM3 все равно будет переключаться. Я хочу, чтобы любое поле, которое выделено, было привязано к клавише Return. Используя приведенный ниже пример, когда выделен COM1, нажатие Return включает / выключает COM1 вместо COM3

State when COM1 is highlightedState when COM3 is selected

Моя функция принимает список значений и объект фрейма, создает Checkbutton для каждого значения в списке, добавляет Checkbutton в список и возвращает его. В случае с моими фотографиями список был [COM1, COM3]

def make_checkboxes(frame, checkbox_list):
    """
    Description:            Make a series of Checkboxes for each value in the passed in list
    :param frame:           frame where all checkboxes will be placed
    :param checkbox_list:   list of values that each need a checkbox
    :return:                a checkbox entry list
    """
    boolean_list = []
    check_box = {}
    created_check_boxes = []
    for value in checkbox_list:
        # Create boolean for the current checkbox, set it to off
        boolean = IntVar()
        boolean.set(0)
        # Create checkbox with boolean that toggles it
        check_box = Checkbutton(frame, text=value, variable=boolean)
        check_box.pack()
        check_box.bind('<Return>', lambda e: toggle_check_box(boolean))
        created_check_boxes.append(check_box[value])
    return created_check_boxes

def toggle_check_box(check_box_obj):
    """
    Description:        Toggles a check box on and off when <Return> key is pressed
    :param boolean:     The current state of a checkbox 
    """
    if check_box_obj.get() == 1:
        check_box_obj.set(0)
    elif check_box_obj.get() == 0:
        check_box_obj.set(1)

1 Ответ

2 голосов
/ 26 февраля 2020

Есть две проблемы:

  1. Ваш код показывает общую проблему "lambda-in-al oop" , где используется функция lambda значение переменной время выполнения , а не время определения , т. е. независимо от того, какая кнопка нажата, boolean будет иметь значение из последней итерации l oop

  2. То, что вы хотите достичь с помощью привязки, уже является стандартным поведением для нажатия клавиш пробела и возврата, т. Е. С помощью bind, после устранения вышеуказанной проблемы вы фактически переключите кнопку дважды , отменяя эффект. Он понадобится вам только в том случае, если вы хотите переключать клавиши с помощью какой-либо другой клавиши, например, t (для «переключения») (хотя это может зависеть от ОС)

(Кроме того, вы, вероятно, хотите check_box[value] = ..., сохраняя флажки в словаре, который вы создали до l oop, но это может быть просто опечатка.)

Собрав все это вместе, вы можете попробовать это (или просто полностью удалите строку):

#         index     not space or enter    bind b here          use b here
check_box[value].bind('<t>', lambda e, b=boolean: toggle_check_box(b))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...