今日も見に来てくださって、ありがとうございます。石川さんです。
Python GUIプログラミング教室、先日はウィンドウを出して、サイズを変更して、背景色を変更するところまでやりました。次は、どうしようかなぁ、と、思っていましたが、やっぱりゲームなら、キャンバスが使えないとダメでしょう。と、いうことで、Canvasを作ってみましょう。
とりあえず、ウィンドウを出すテンプレートとして、以下のスクリプトを覚えてもらいました。
import tkinter as tk class Application(tk.Tk): def __init__(self): super().__init__() # ここに色々な設定を書いていきます。 self.mainloop() if __name__ == "__main__": Application()
サンプルとして、キャンバスを作ってみましょう。
self.canvas = tk.Canvas() self.canvas.pack()
追加しましたが、大きさが若干変化したくらいで、あんまり変わりませんね。次に線を引いてみましょう。
self.canvas.create_line(10,10,200,200)
キャンバスは、左上に原点の(0,0)があって、x軸が右、y軸が下に行くほど数値が増えていく構造です。なので上記の一行は、左上の(10,10)の座標から右下の(200,200)へ線を引く、という命令になります。ここまで教えて、さあ、自分でも好きな線を引いてみて、と、促したところ、下の二行を追加してくれました。
self.canvas.create_line(100,100,200,200) self.canvas.create_line(65,65,150,150)
当然ながら、実行しても線は増えませんね。追加した線は、もともと引いてあった線の上を引き直しているだけですからねぇ。
次に、fill=”white”とか”red”で色が付けられることと、create_rectangleで四角形、create_ovalで楕円が書けることを教えてあげて、遊んでもらいました。最終的に何かができた、と、言っていたのですが、出来上がりは、こんな感じでした!
そして、そこで終わらずに、さらに欲張って、キーボードを押されたイベントで押されたキーを出力するスクリプトを追加しました。
import tkinter as tk class Application(tk.Tk): def __init__(self): super().__init__() self.canvas = tk.Canvas() self.canvas.pack() self.canvas.create_rectangle(10,50,200,160,fill="white") self.canvas.create_oval(80,80,130,130,fill="red") self.bind("<KeyPress>",self.print_key) self.mainloop() def print_key(self, event): print(event.keysym) if __name__ == "__main__": Application()
12行目のbind
で"<KeyPress>"
イベントに、16行目のself.print_key
メソッドを割り当てています。つまり、何かのキーが押されたよ、というイベントが発生したら、self.print_key
メソッドが実行されるようになります。print_key
の中で、event.keysym
をprint
しています。押されたキーの内容によって、event.keysym
の内容が変化します。適当にキーを押すと、出力結果は以下のようになりました。
space a b c Return BackSpace F1 F2 Down Left Up Right 1 2 3 4 Shift_L exclam
この結果から、矢印キーが押されたときに何かさせようとすると、「Down」「Left」「Up」「Right」を判定すればうまくいきそうです。
さあ、次は、、、と、思っていたら、もう疲れた~、と、またしても逃げられてしまいました。ねぇ、ホントはプログラミングしたくないんじゃないの?
む~、それか、教え方がよくないのかなぁ。。。