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

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

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

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

Q&A

1回答

3004閲覧

「Python・Tkinter」ボタンを押さずに割り込み処理を実行したい。

usann

総合スコア2

Python 3.x

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

0グッド

0クリップ

投稿2021/12/20 12:23

前提・実現したいこと

タイマーを起動して、ボタンなど(マウス、キーボード)を押さずにcount=5になったら、quit_app()が自動的に実行されるコードを作りたいです。

該当のソースコード

python

1# -*- coding:utf-8 -*- 2import tkinter 3import threading 4 5start_flag = False 6quitting_flag = False 7count = 0 8 9 10# タイマー 11def timer(): 12 global label 13 global start_flag 14 global quitting_flag 15 global count 16 17 while not quitting_flag: 18 if start_flag: 19 label.config(text=count) 20 count += 1 21 if count > 10: 22 start_flag = False 23 24 import time 25 time.sleep(1) 26 27 28 29# スタートボタンが押された時の処理 30def start_button_click(event): 31 global start_flag 32 global count 33 34 count = 0 35 start_flag = True 36 37# ストップボタンが押された時の処理 38def stop_button_click(event): 39 global start_flag 40 global count 41 start_flag = False 42 43# 終了ボタンが押された時の処理 44def quit_app(): 45 global quitting_flag 46 global app 47 global thread1 48 49 quitting_flag = True 50 51 # thread1終了まで待つ 52 thread1.join() 53 54 # thread1終了後にアプリ終了 55 app.destroy() 56 57# メインウィンドウを作成 58app = tkinter.Tk() 59app.geometry("200x100") 60 61# ボタンの作成と配置 62start_button = tkinter.Button( 63 app, 64 text="スタート", 65) 66start_button.pack() 67 68stop_button = tkinter.Button( 69 app, 70 text="ストップ", 71) 72stop_button.pack() 73 74 75# ラベルの作成と配置 76label = tkinter.Label( 77 app, 78 width=5, 79 height=1, 80 text=0, 81 font=("", 20) 82) 83label.pack() 84 85# イベント処理の設定 86start_button.bind("<ButtonPress>", start_button_click) 87stop_button.bind("<ButtonPress>", stop_button_click) 88app.protocol(count == 5, quit_app) #これで動かなかった。 89 90# スレッドの生成と開始 91thread1 = threading.Thread(target=timer) 92thread1.start() 93 94# メインループ 95app.mainloop()

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

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

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

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

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

TakaiY

2021/12/20 13:08

提示のコードにどのような問題があるのでしょう?
usann

2021/12/21 04:11

countの値が5になった時に、quit_appが実行されないという問題です。
guest

回答1

0

app.protocolの第一引数はstr型のオブジェクトです。bool型のobjectを指定すると常に条件を満たさないので何も実行されません。

自分でcountを変更しているのですから、そこでcountが5となった場合にquit_app()を呼び出せば良いでしょう。
それがいやなら、カウントを増減して、その増減時にチェックを行うようなクラスを定義して、それを使うことも可能ですが、かえって複雑なコーディングが必要になるでしょう。

投稿2021/12/20 13:44

ppaul

総合スコア24666

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

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

usann

2021/12/21 04:42

カウントを増減して、その増減時にチェックを行うようなクラスというのは、どのように書けばいいですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問