неожиданное поведение return_keyboard_events в PySimpleGUI - PullRequest
2 голосов
/ 20 июня 2019
import PySimpleGUI as sg

layout = [[sg.Button("OK1", key='1', bind_return_key=True)],
      [sg.Button("OK2", key='2', bind_return_key=True)],
      [sg.Button("OK3", key='3', bind_return_key=True)]]
window = sg.Window("Keyboard Test", return_keyboard_events=True).Layout(layout)
while True:
    event, values = window.Read()
    print(event)
    if event == None:
        break

Когда я запускаю приведенный выше код и выполняю операцию щелчка мыши, я получаю вывод в следующем порядке, как и ожидалось,

при нажатии Кнопка OK1 печать в консоли как: 1

нажатие на кнопку OK2 печать в консоли в виде: 2

нажатие на кнопку OK3 печатать в консоли как: 3

Но, когда я выполняю средства обработки событий на клавиатуре, я нажимаю на кнопку через клавишу табуляции на клавиатуре и нажимаю Enter на этой кнопке через клавиатуру она возвращает одну и ту же клавишу на всех этих трех кнопках,

Посещайте эти кнопки одну за другой с помощью клавиши табуляции и затем нажимайте Enter для каждого. Я получаю результат как

Нажмите Enter на кнопку OK1 для печати в консоли: 1

Нажмите Enter на кнопку OK2 для печати в консоли как: 1

Нажмите Enter на Кнопка OK3 распечатайте в консоли как: 1

Это не ожидается выход.То, что я хочу, должно также напечатать свой собственный ключ, такой же, как событие щелчка мыши.

Каково мое намерение:

  1. Когда пользователь нажимает кнопку «Ввод» над OK1, он должен напечатать («Здравствуйте, OK1 нажал».)

  2. Когда пользователь нажимает кнопку «Ввод» над OK2, он должен напечатать («Здравствуйте, OK2 нажал.»)

  3. Когда пользователь нажимает кнопку «Ввод» над OK3, он должен напечатать ('Здравствуйте, OK3 нажата. ')

  4. Когда пользователь нажимает на OK1, он должен напечатать («Здравствуйте, OK1 нажал.»)

  5. Когдапользователь нажимает на OK2, он должен напечатать («Hello, OK2 нажал».)

  6. Когда пользователь нажмет на OK3, он должен напечатать («Hello, OK3 нажал.»)

Как этого добиться?

Ответы [ 2 ]

1 голос
/ 22 июня 2019

Я наконец понял вопрос и написал это как решение.Он был превращен в демонстрационную программу для проекта, потому что люди ожидают, что клавиша ENTER нажмет кнопку, и все же tkinter и Qt, похоже, не работают таким образом.Они выбирают кнопки с помощью пробела.

Этот исходный код работает как для PySimpleGUI, так и для PySimpleGUIQt.Просто используйте правильный оператор импорта в верхней части.

    import PySimpleGUI as sg
    # import PySimpleGUIQt as sg

    QT_ENTER_KEY1 =  'special 16777220'
    QT_ENTER_KEY2 =  'special 16777221'

    layout = [  [sg.T('Test of Enter Key use')],
                [sg.In(key='_IN_')],
                [sg.Button('Button 1', key='_1_')],
                [sg.Button('Button 2', key='_2_')],
                [sg.Button('Button 3', key='_3_')],  ]

    window = sg.Window('My new window', layout,
                       return_keyboard_events=True)
    while True:             # Event Loop
        event, values = window.Read()
        if event is None:
            break
        if event in ('\r', QT_ENTER_KEY1, QT_ENTER_KEY2):         # Check for ENTER key
            elem = window.FindElementWithFocus()                            # go find element with Focus
            if elem is not None and elem.Type == sg.ELEM_TYPE_BUTTON:       # if it's a button element, click it
                elem.Click()
            # check for buttons that have been clicked
        elif event == '_1_':
            print('Button 1 clicked')
        elif event == '_2_':
            print('Button 2 clicked')
        elif event == '_3_':
            print('Button 3 clicked')

Из всего приведенного выше кода часть, реализующая эту функцию, содержится в этих 4 строках кода.Добавьте эти строки кода в ваш цикл обработки событий, и тогда ваше окно будет вести себя так, что клавиша ENTER будет нажимать кнопку.Остальная часть кода работает с щелчками, макетом и т. Д. Именно эти операторы реализуют его.

if event in ('\r', QT_ENTER_KEY1, QT_ENTER_KEY2):         # Check for ENTER key
    elem = window.FindElementWithFocus()                            # go find element with Focus
    if elem is not None and elem.Type == sg.ELEM_TYPE_BUTTON:       # if it's a button element, click it
        elem.Click()
1 голос
/ 20 июня 2019

Я не совсем понимаю, какова ваша цель.Какое поведение вы хотите?

Когда кнопка имеет фокус, нажатие клавиши возврата, по-видимому, не запускает кнопки по умолчанию.Пробел будет.

Вот код, который будет нажимать кнопку на основе ввода с клавиатуры пользователя.Я думаю, это было то, что вы описали после того, как я перечитал ваш вопрос несколько раз.

import PySimpleGUI as sg

layout = [[sg.Button("OK1", key='_1_', )],
          [sg.Button("OK2", key='_2_', )],
          [sg.Button("OK3", key='_3_', )]]

window = sg.Window("Keyboard Test", layout, return_keyboard_events=True)

while True:
    event, values = window.Read()
    # window.Maximize()
    print('event: ', event)
    if event == None:
        break
    if event == '1':
        window.Element('_1_').Click()
    elif event == '2':
        window.Element('_2_').Click()
    elif event == '3':
        window.Element('_3_').Click()

window.Close()

Если вы хотите управлять кнопками с помощью клавиатуры, то вам нужно будет собрать нажатия клавиш на клавиатуре, а затем преобразовать их в любое поведение по вашему желанию.

Нажатие кнопки ENTER, когда кнопка имеет фокус (выделен), НЕ генерирует нажатие кнопки, ПРОБЕЛ делает.Это можно продемонстрировать в этой программе tkinter:

import tkinter as tk


def write_slogan():
    print("Tkinter is easy to use!")


root = tk.Tk()
frame = tk.Frame(root)
frame.pack()

button = tk.Button(frame,
                   text="QUIT",
                   fg="red",
                   command=quit)
button.pack(side=tk.LEFT)
slogan = tk.Button(frame,
                   text="Hello",
                   command=write_slogan)
slogan.pack(side=tk.LEFT)

root.mainloop()

[РЕДАКТИРОВАТЬ - извините за правки, но я экспериментирую ...]

...