質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

665閲覧

Windowを閉じた後もプロセスが残っている。

Deng

総合スコア19

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

2グッド

1クリップ

投稿2024/08/21 01:09

編集2024/08/21 04:09

実現したいこと

Windowを閉じた後に、プロセスが完全に終了したい。

前提

1)IDEはSpyderを使います。
2)無料のPysimpleGUI 4.60.4を使います。

発生している問題・エラーメッセージ

エラーメッセージはないですが、プロセスが残っています。

該当のソースコード

Python

1import PySimpleGUI as sg 2 3def on_right_click(event): 4 # Calculate the mouse click position 5 mouse_x = event.x 6 mouse_y = event.y 7 sg.popup(f'Right-click detected at ({mouse_x}, {mouse_y})') 8 9# Create the layout with an Image element 10layout = [ 11 [sg.Text('Right-click on the image')], 12 [sg.Image(filename='', key='-IMAGE-', size=(400, 400))] 13] 14 15# Create the window 16window = sg.Window('Right-Click Example', layout, finalize=True) 17 18# Load an image (Replace with your image path) 19image_path = r'.\P1.PNG' 20window['-IMAGE-'].update(filename=image_path) 21 22# Access the tkinter Canvas widget used by PySimpleGUI 23canvas = window['-IMAGE-'].Widget 24 25# Bind the right-click event to the on_right_click function 26canvas.bind("<Button-3>", on_right_click) # <Button-3> is the event for right-click 27 28# Event loop 29while True: 30 event, values = window.read(timeout=100) # Add a timeout to allow for a more responsive event loop 31 32 if event == sg.WIN_CLOSED: # Close the window if the user closes it 33 break 34 35window.close() 36

試したこと

右クリックの動作が成功しています。

補足情報(FW/ツールのバージョンなど)

Python 3.11.8 64-bit | Qt 5.15.2 | PyQt5 5.15.10 | Windows 10 (AMD64)

tatsu99, melian👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2024/08/21 04:56

timeoutを指定しているので、sg.WIN_CLOSED を広い損ねるのかと思ったのですが、それだとタイミング次第なので、再現性が無いはずですね。 プログラム起動からウィンドウを閉じるまでを10-20回繰り返しても、同じですか?
Deng

2024/08/21 06:28

最初には、timeoutを設定していなかったです。仕方ないので、付けています。timeoutを付けたくないです。
otn

2024/08/21 09:54

プログラム起動からウィンドウを閉じるまでを10-20回繰り返しても、同じですか?
guest

回答2

0

[香車]東上☆あらし☆海美「

右クリップの動作が成功しています。

窓が閉じた後も『右クリック』すると、ポップアップ・メニューが出る、ということですか ?

投稿2024/08/21 01:53

umimi

総合スコア526

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Deng

2024/08/21 02:24

umimi様 ご質問ありがとうございます。 私が遣りたい動作は、Windowを開いて、写真が表示させます。そして、マオスの右クリックして、マオスが居た場所の座標を表示します(ポンプアップします)。この操作が成功しました。しかし、写真を表示している窓を閉じても、プロセスが完全に終了しなくで、残っています。loopを残っているようです。
guest

0

ベストアンサー

Callback 関数(on_right_click)内ではなく、event loop 内で popup window を表示する様にしてみてはどうでしょうか。具体的には、callback 関数内で write_event_value() メソッドで発生させた event(Popup) を event loop 内で捕捉して関数(popup_window())を呼び出します。

python

1import PySimpleGUI as sg 2 3def on_right_click(event): 4 global window 5 window.write_event_value('Popup', event) 6 7def popup_window(event): 8 # Calculate the mouse click position 9 mouse_x = event.x 10 mouse_y = event.y 11 sg.popup(f'Right-click detected at ({mouse_x}, {mouse_y})', keep_on_top=True) 12 13# Create the layout with an Image element 14layout = [ 15 [sg.Text('Right-click on the image')], 16 [sg.Image(filename='', key='-IMAGE-', size=(400, 400))] 17] 18 19# Create the window 20window = sg.Window('Right-Click Example', layout, finalize=True) 21 22# Load an image (Replace with your image path) 23image_path = r'.\P1.PNG' 24window['-IMAGE-'].update(filename=image_path) 25 26# Access the tkinter Canvas widget used by PySimpleGUI 27canvas = window['-IMAGE-'].Widget 28 29# Bind the right-click event to the on_right_click function 30canvas.bind("<Button-3>", on_right_click) # <Button-3> is the event for right-click 31 32# Event loop 33while True: 34 event, values = window.read() 35 36 if event == 'Popup': 37 popup_window(values[event]) 38 continue 39 40 if event == sg.WIN_CLOSED: # Close the window if the user closes it 41 break 42 43window.close()

追記

sg.popup()non_bloking=True を指定する方法もあります。

Popup non blocking - PySimpleGUI Documentation

NameTypeDefaultDescription
non_blockingboolTrueif True the call will immediately return rather than waiting on user input

python

1def on_right_click(event): 2 # Calculate the mouse click position 3 mouse_x = event.x 4 mouse_y = event.y 5 sg.popup(f'Right-click detected at ({mouse_x}, {mouse_y})', non_blocking=True)

ですが、この場合 OK ボタンを押さないで右クリックを行うと、複数のポップアップウィンドウが表示されたままの状態になります。

イメージ説明

投稿2024/08/21 07:35

編集2024/08/21 10:40
melian

総合スコア20710

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Deng

2024/08/21 12:20

Melian様 大変助かりました。課題を解決していただきました。感謝致します。 PS:残した小さい課題があります。popupしたウィンドウは、ずっと同じ場所でした。モニタースクリーンの中央です。
melian

2024/08/21 14:23

location キーでポップアップウィンドウを表示する位置を指定することができます。例えば、以下の様に event.x_root と event.y_root を指定すると、右クリックした位置にウィンドウが表示されます。 sg.popup(f'Right-click detected at ({mouse_x}, {mouse_y})', keep_on_top=True, location=(event.x_root, event.y_root))
Deng

2024/08/21 22:57

Melian様 おはようございます!ありがとうございました。勉強になりました! 素晴らしい一日をあるように!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問