2
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

但是,当我执行键盘事件时,我通过键盘的 tab 键访问按钮并通过键盘按该按钮上的Enter 键,它在所有这三个按钮上返回相同的键,

通过 tab 键一个一个地访问这些按钮,然后在每个我得到结果时按 Enter,

在OK1上按 Enter按钮在控制台中打印为: 1

在控制台中按OK2 按钮打印为: 1

在控制台中按OK3 按钮打印为: 1

这不是预期的输出。我想要的它也应该像鼠标点击事件一样打印自己的键。

我的意图是什么:

  1. 当用户在 OK1 上按下 Enter 按钮时,它应该打印('Hello, OK1 pressed.')

  2. 当用户在 OK2 上按下 Enter 按钮时,它应该打印('Hello, OK2 pressed.')

  3. 当用户在 OK3 上按下 Enter 按钮时,它应该打印('Hello, OK3 pressed.')

  4. 当用户点击 OK1 时,它应该打印('你好,OK1 被按下。')

  5. 当用户点击 OK2 时,它应该打印('Hello, OK2 press.')

  6. 当用户点击 OK3 时,它应该打印('Hello, OK3 press.')

如何做到这一点?

4

2 回答 2

2

我终于理解了这个问题并将其写为解决方案。它已变成该项目的演示程序,因为人们确实希望 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()
于 2019-06-22T15:04:56.993 回答
1

我不完全明白你的目标是什么。你想要什么行为?

当按钮获得焦点时,默认情况下按下返回键似乎不会触发按钮。空格键会。

这是一些将根据用户的键盘输入单击按钮的代码。我认为这是您在我重新阅读您的问题几次后所描述的。

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

[编辑 - 对编辑感到抱歉,但我正在尝试......]

于 2019-06-20T18:19:22.293 回答