LoginSignup
GOU_KUN
@GOU_KUN

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PySimpleGUIのボタンをエンターで押して実行したい

解決したいこと

PySimpleGUIでプログラムを作っています。
エンターキーを押すと、OKボタンが押されるようにしたいのですが、解決方法が分かりません。
それなりに調べたのですが、これといった情報はありませんでした。
どなたかわかる方、回答お願い致します。

エラーメッセージ

AttributeError: 'Input' object has no attribute 'Click'

ソースコード

import PySimpleGUI as sg

sg.theme('DarkAmber')
layout = [  [sg.Text('何か入力してください')],
            [sg.InputText()],
            [sg.Button('OK'), sg.Button('キャンセル')] ]

window = sg.Window('エンターキーを押してOKをクリックさせたい', layout, alpha_channel=0.95, no_titlebar=True, grab_anywhere=True,return_keyboard_events=True)
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED or event == 'キャンセル':
        break
    if event == "OK":
        print(values[0])

window.close()

実行結果

スクリーンショット 2021-02-06 185452.png

自分で試したこと

調べていると、こちらのサイトを発見しました。
このサイトの解答にあったソースコードをコピーして実行してみると、見事にエンターキーでボタンがクリックできました。

コピーしたソースコード
import PySimpleGUI as sg

layout = [  [sg.Text('Button Test')],
            [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 == '\r':
        elem = window.FindElementWithFocus()
        if elem is not None:
            elem.Click()
    elif event == '_1_':
        print('Button 1 clicked')
    elif event == '_2_':
        print('Button 2 clicked')
    elif event == '_3_':
        print('Button 3 clicked')

しかし、そこにインプットボックスを追加して、フォーカス(クリック)するとエラーが出ました。
今気が付いたのですが、どうやらTabキーでフォーカスを変更することができるようです。
OKボタンよりインプットボックスが先にあるので、最初にインプットボックスがフォーカスされてしまっているようです。
PyAutoGUIでTabキーを押してみてもいいかもしれませんが、もっと簡単な方法があるかと思い質問しました。

0

1Answer

こんな感じで行けました。

code
import PySimpleGUI as sg

sg.theme('DarkAmber')
layout = [  [sg.Text('何か入力してください')],
            [sg.InputText()],
            [sg.Button('OK'), sg.Button('キャンセル')] ]

window = sg.Window('エンターキーを押してOKをクリックさせたい', layout, alpha_channel=0.95, no_titlebar=True, grab_anywhere=True,return_keyboard_events=True)
while True:
    event, values = window.read()
    # print(f"event='{event}', code={ord(event[0])}, values={values}\n")
    if event == sg.WIN_CLOSED or event == 'キャンセル' or event == 'Escape:27':
        break
    if event == "OK" or event == '\r':
        print(f"values={values}")

window.close()

コメントにしてある部分で、キーを押したときの入力を調べました。

0

Comments

  1. @GOU_KUN

    Questioner
    なるほど!
    eventで調べることができるんですね。
    ありがとうございます!!

Your answer might help someone💌