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

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

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

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

Tkinter

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

解決済

Python3 tkinter whileループを開始するとボタンが押せなくなる

opyon
opyon

総合スコア1009

Python 3.x

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

Tkinter

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

3回答

1評価

1クリップ

12105閲覧

投稿2018/09/19 05:21

参考にした質問と回答:Python3のtkinterで並行処理?を行いたい
参考にしたサイト:簡易ストップウォッチを作ってみた @Python3

似たような質問で恐縮です。
上記を参考に見よう見真似で簡易ストップウォッチを作ったのですがスタートした後に他ボタンを押すと
反応が無く強制終了するしかない状態です。
他のボタンを押さなければ1秒毎に標準出力で秒数のカウントは出来ています。

スレッド化無しで動くならスレッド化は無くてもよいのですがwhileループ中にボタンを反応させるにはどこが間違っているのでしょうか?
ヒントだけでもご教示いただけると助かります。

###実現したいこと
スタート,ストップ,終了ボタン制御
ループを使ったラベルの常時更新

###試したこと
Python3のtkinterで並行処理?を行いたいの@KSwordOfHasteさんの回答コードで動作確認済み。
クラス化したこと以外は同じような処理にしたつもりなのですがうまく動きません。
フラグをself.インスタンス変数にしてみたりフラグ変数の配置場所を変えてみましたが結果は変わりませんでした。
ループ無しでの動作は一通り問題無く動いています。

Python3.7.0

Python3

# coding=UTF-8 import sys import time import tkinter as tk import threading as th class SSW(tk.Frame): def __init__(self, master = None): tk.Frame.__init__(self, master) self.master.title("Sample Stop Watch") self.master.bind("<Control-q>", self.quit) self.master.geometry("280x160") self.lbl_msg = tk.Label(master, text = "<quit:Control-q>") self.lbl_msg.pack(side = "top") self.lbl_lap = tk.Label(master, text = "0.00") self.lbl_lap.pack(side = "top") self.btn_run = tk.Button(master, text = "run", command = self.run) self.btn_run.pack() self.btn_end = tk.Button(master, text = "end", command = self.end) self.btn_end.pack() self.btn_quit = tk.Button(master, text = "quit", command = self.quit) self.btn_quit.pack() def loop(self): global timer_start timer_start = time.time() global stop_flg stop_flg = False while not stop_flg: time.sleep(1) timer_lap = time.time() - timer_start out_lap = round(timer_lap, 2) self.lbl_lap.configure(text = out_lap) print(out_lap) def run(self): print('Start!') # スレッド開始 th.Thread(target = self.loop()).start() def end(self): print('Stop!') global stop_flg stop_flg = True def quit(self): sys.exit() # main if __name__ == '__main__': ss = SSW() ss.pack() ss.mainloop()

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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

Tkinter

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