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

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

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

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

Q&A

解決済

1回答

4013閲覧

tkinterモジュールのメインループの仕組みがよくわからない

Mitacchi

総合スコア7

Python

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

0グッド

0クリップ

投稿2020/03/16 10:26

前提・実現したいこと

tkinterモジュールのbindを用いてリアルタイムキー入力をしたいのですが、どこでプログラムがループしているのかよくわからず、うまくいきません...
下のコードのように書くと成功するのですが、main_proc関数内をループしているはずなのになぜbind命令を毎回受け取れるのでしょうか
root.mainloopがどのようなループをしているか教えてほしいです

該当のソースコード

python

1import tkinter 2 3key = 0 4def key_down(e): 5 global key 6 key = e.keycode 7 8def main_proc(): 9 label["text"] = key 10 root.after(100, main_proc) 11 12root = tkinter.Tk 13root.title("test") 14root.bind("<KeyPress>", key_down) 15label = tkinter.Label(font=("System", 80)) 16label.pack() 17main_proc() 18root.mainloop()

試したこと

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

Python3.0のtkinterのmainloop() について
ここの回答が最もわかりやすく説明してくれてると思います。

投稿2020/03/16 10:34

yureighost

総合スコア2183

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

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

Mitacchi

2020/03/16 10:44

以前も似たような質問があったのですね、すみません 拝見させていただきました ですがやはりわからない箇所があります... mainloopにたどり着く前にmain_proc関数を呼び出してループに入っていると思うのですが、それでもなお下のmainloopは実行されるのでしょうか 本当に初心者ですみません、、
Mitacchi

2020/03/16 10:54

すみません、関数に対する認識が間違っていました... 解決しました!ありがとうございます
yureighost

2020/03/16 10:55

むしろbindで登録したイベント(質問のソースではキーを押す)の動作を検知するためにループし続けるのが mainloopの役割だからですね。
Mitacchi

2020/03/16 10:58

mainloopの中にbindを組み込むといったイメージですかね 勉強不足です...回答ありがとうございました
yureighost

2020/03/16 11:11

あー、afterのところでループして処理が止まってるって認識なのでしょうか。 afterで止まるようなことはなく一旦mainloopまで処理は進んでいます。 afterは処理が回った時に一つ目の引数の時間で二つ目の引数の関数を実行するように内部的に登録されているってイメージですかね。 bindのイベントも同様でmainloopがdestroyされるまでは登録したイベントの動作を監視し続けて、 それが行われた時に引数に渡した関数の処理を行います。
Mitacchi

2020/03/16 13:00

なるほど!一旦mainloopまで処理して、その時に実行するのがafterなのですね... やはり最初から認識を改めないといけないですね 初歩的な質問に何度も回答ありがとうございます...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問