こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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()

投稿日時 - 2018-05-30 20:15:29

QNo.9503562

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

 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)をしたいのであれば、タイマーイベントを作るなどの工夫が必要です。

投稿日時 - 2018-05-30 22:26:41

あなたにオススメの質問