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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

5813閲覧

PySimpleGUIの無限ループをボタンを利用して抜けたい

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/14 02:38

[ 実現したいこと ]
PySimpleGUIを用いて、開始ボタンを押すと指定した動作を一定間隔で実行するGUIを作成しています。以下に示すコードで実装しているのですが、指定した処理を中断させるのに、現状ではコマンドプロンプト上でCtrl+Cを入力することで実現しています。
この中断方法を、ボタンのGUIを利用して実現したいと考えてます。

python

1import PySimpleGUI as sg 2import pyperclip 3import subprocess 4import time 5import threading 6import pyautogui as pgui 7 8#変数宣言*************** 9#省略 10#************************ 11 12def set_pisi: 13 #省略 14 15def update(i): 16 #繰り返す処理(省略) 17 18sg.theme('LightGray1') 19layout = [ [sg.Text('切り替え時間 約',font=('小塚ゴシック',12)),sg.InputText(default_text='5',size=(2,3), key='enter_time'),sg.Text('秒(最低2)',font=('小塚ゴシック',12))], 20 [sg.Text('切り替えTabの数',font=('小塚ゴシック',12)),sg.InputText(default_text='2',size=(2,3), key='tab_number'),sg.Text('(最高4)',font=('小塚ゴシック',12))], 21 [sg.Text('座標初期値は切り替えTab数2かつ以下を想定',font=('小塚ゴシック',10),text_color='#000000')], 22 [sg.Text(' →総Tab数4~5 : 切り替えTab=3,4',font=('小塚ゴシック',10))], 23 [sg.Text('コマンドプロンプト上でCtrl + C でループ抜ける',font=('小塚ゴシック',10),text_color='#000000')], 24 [sg.Button('開始',key='start'),sg.Button('座標設定',key='posi')] ] 25 26window = sg.Window('Enter/Tag自動',layout,resizable=True,size=(300,180)) 27 28while True: 29 event, values = window.read() 30 31 if event == 'posi': 32  #省略 33 34 if event == 'start': 35 #省略 36 #ループに入るために値変更 37 auto = True 38 39 if event == None: 40 break 41 42 if auto: 43 try: 44     #以下繰り返し処理のためのループ 45 #このループをボタンクリックで抜けたい 46 while True: 47 48 t = threading.Thread(target = update(tab_posi)) 49 t.start() 50 next_time = ((base_time - time.time()) % interval) or interval 51 time.sleep(next_time) 52 53 #省略 54 55 #Ctrl+Cでループを抜ける 56 except KeyboardInterrupt: 57 print("out roop") 58 auto = False 59 60window.close()

このコードを基盤に改良して実現できるのが一番ですが、
根本から変更しなければ実現できないのであれば、最初から作り直そうと思います。
是非ご教授お願いします!

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

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

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

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

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

guest

回答1

0

ベストアンサー

sg.one_line_progress_meter で、
ループの中断条件に使えるプログレスバーを表示できます。
(但し、time.sleepが長すぎる場合は任意のタイミングで動きません)

window.read のオプションに指定する timeout オブションも調べてみて下さい。
一定間隔の時間でイベントを送ってくれるので、タイマーのように扱えます。

構造的な改良を加えるなら、
ループ内で毎回スレッドを作るのではなく、スレッド内でループ処理をして、
中断時にフラグなどでスレッド側のループ条件を抜けるようにすると良いです。

参考: Pysimpleguiのデバックウインドウやプログレスメーターのボタンで処理を中断できるようにしたい

投稿2020/06/14 06:13

teamikl

総合スコア8760

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

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

退会済みユーザー

退会済みユーザー

2020/06/14 09:11

回答ありがとうございます! リンクの記事など参考にさせていただきました また、スレッドの生成に関しても自分なりに改良していきたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問