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

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

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

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

Python

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

Q&A

解決済

2回答

6938閲覧

after処理を止める方法

dakara1219

総合スコア5

Tkinter

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

Python

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

0グッド

0クリップ

投稿2020/04/05 00:15

前提・実現したいこと

Pythonのtkinterを使用して簡単なストップウォッチのようなものを作りたいと思っております。
スタートを押すとカウントアップが始まり
停止ボタンでストップ
リセットボタンで0に戻るというソフトです。

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

リセットボタンを作りましたが
一瞬文字が表示されてもまたすぐカウントアップが始まってしまいます
リセットボタンや、これから作る予定のストップボタンで、after処理にて行っているカウントアップを停止させる方法がわかりません。

該当のソースコード

import tkinter

tmr=0
def count_up():
global tmr
tmr=tmr+1
label["text"]=tmr
label.update()
root.after(1000,count_up)

def reset():
tmr=0
label["text"]=tmr
label.update()

root=tkinter.Tk()
root.title("タイマー")
root.resizable(False,False)
canvas=tkinter.Canvas(root, width=200,height=300)
canvas.pack()

label=tkinter.Label(font=("Times New Roman",80))
label.place(x=70,y=10)

button=tkinter.Button(root,text="起動!",font=("Times New Roman",30),command=count_up,fg="black")
button.place(x=30,y=130)

button=tkinter.Button(root,text="リセット",font=("Times New Roman",15),command=reset,fg="black")
button.place(x=70,y=220)

root.mainloop()

試したこと

ブレーク等ネットを探してそれらしきものを打ち込んでみたのですが、特に変わらないかエラーがでるだけでした

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

Python 3.8

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

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

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

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

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

guest

回答2

0

ベストアンサー

A1. after_cancel() に after() の戻り値を渡します。

python

1tmr=0 2jobId=None 3 4def count_up(): 5 global tmr,jobId 6 tmr=tmr+1 7 label["text"]=tmr 8 label.update() 9 jobId=root.after(1000,count_up) 10 11def reset(): 12 global tmr,jobId 13 tmr=0 14 label["text"]=tmr 15 label.update() 16 if jobId is not None: 17 root.after_cancel(jobId) 18 jobId=None

A2. 停止フラグを設定する

こちらはafterでスケジュールされた関数の実行はキャンセルしませんが、
count_up が連続して呼び出されるのを止められればよいので。

python

1tmr=0 2stop_counter=False 3 4def count_up(): 5 global tmr, stop_counter 6 if stop_counter: 7 stop_counter = False 8 return 9 tmr=tmr+1 10 label["text"]=tmr 11 label.update() 12 root.after(1000,count_up) 13 14def reset(): 15 global tmr, stop_counter 16 tmr=0 17 label["text"]=tmr 18 label.update() 19 stop_counter = True

投稿2020/04/05 00:51

編集2020/04/05 00:52
teamikl

総合スコア8664

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

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

dakara1219

2020/04/05 06:47

2パターンもありがとうございます! よく見比べてみます
guest

0

root.after自体を変数に格納しておき、それをafter_cancel関数に渡すことでafter関数の動作を解除できます。

python

1・・・ 2count_up_func = None 3tmr=0 4def count_up(): 5 global tmr 6 tmr=tmr+1 7 label["text"]=tmr 8 label.update() 9 global count_up_func 10 count_up_func = root.after(1000,count_up) 11 12def reset(): 13 global tmr 14 tmr=0 15 label["text"]=tmr 16 label.update() 17 global count_up_func 18 root.after_cancel(count_up_func) 19 count_up_func = None 20・・・

投稿2020/04/05 00:48

yureighost

総合スコア2183

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

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

dakara1219

2020/04/05 06:47

ありがとうございます! 停止ボタンもリセットボタンもつくれました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問