- 締切済み
Pythonでキーが押されたことを判定したい
Python初心者です。Pythonでキー入力の値を変数keyとして取り出したいのですが、上手くいきません。 グローバル関数がわかっていないのかと思いますが直し方がわかりません。 最終的に37行目のprint(key)でkeyの値を取り出したいのですがどうすればよいですか。 # -*- coding: utf8 -*- import tkinter as tk import winsound root = tk.Tk() frame = tk.Canvas(root, width=800, height=600) pimg = tk.PhotoImage(file="wall.png") frame.place(x=0, y=0) frame.create_image(400, 300, image=pimg) imgA = tk.PhotoImage(file = 'pressed_A.png') imgB = tk.PhotoImage(file = 'Pressed_B.png') def keyA(event): global key key="A" frame.place(x=0, y=0) frame.create_image(320, 220, image=imgA, tag="illust") root.update() winsound.PlaySound("pressed_A.wav", winsound.SND_FILENAME) def keyB(event): global key key="B" frame.place(x=0, y=0) frame.create_image(320, 220, image=imgB, tag="illust") root.update() winsound.PlaySound("pressed_B.wav", winsound.SND_FILENAME) frame.bind("a", keyA) frame.focus_set() frame.pack() frame.bind("b", keyB) frame.focus_set() frame.pack() print(key) root.mainloop()
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- mitoneko
- ベストアンサー率58% (469/798)
Pythonは、インデントが命なので、ここでソースを出すのは難しいですね。 def keyAと、def keyBの内容は、その後のwinsoundまで。他は、インデント無しの前提で、読んでみます。 関数定義と、メイン実行が入り交じっていますが、このプログラムは、最後の行のroot.mainloop()まで、一気に実行が進みます。その後、プログラムは、その一生をmainloopで過ごします。mainloopでは、各イベントの監視を行い、登録されたイベントがあれば、イベントハンドラを呼び出します。例えば、frame.bind("a",keyA)がその例です。aキーが押された時、keyAを呼び出すわけです。 さて、問題のprint(key)ですが、これ、最初の実行時に、root.mainloop()に到達する直前に一回だけ呼ばれます。その後、2度とここが実行されることはありません。 これが、問題の本質です。 多分、最初のprint(key)の呼び出し時点では、何もキーは押されていないでしょうし、何より、イベントの監視が始まっていませんからその時点では、例えキーが押されていても反応はありません。よって、イベントハンドラは実行されませんから、keyの中身はありません。 そして、mainloopの呼び出しでイベントの監視が始まった後は、もう、二度とこのprint文に制御が渡ることはありません。 というわけで、このprint文が意味のある出力をすることはありません。 定期的にprint(key)をしたいのであれば、タイマーイベントを作るなどの工夫が必要です。