まず、私の前のスレッドを見てください: Tkinter 理解メインループ
そこからのアドバイスに従った後、GUI プログラミングでは、ユーザー入力に対するウィジェットの応答性を維持するために、無限ループを何としてでも回避する必要があります。
使用する代わりに:
while 1:
ball.draw()
root.update()
time.sleep(0.01)
私は自分の関数self.canvas.after(1, self.draw)
内で使用して管理しました。draw()
したがって、私のコードは次のようになります。
# Testing skills in game programming
from Tkinter import *
root = Tk()
root.title("Python game testing")
root.resizable(0, 0)
root.wm_attributes("-topmost", 1)
canvas = Canvas(root, width=500, height=400, bd=0, highlightthickness=0)
canvas.pack()
root.update()
class Ball:
def __init__(self, canvas, color):
self.canvas = canvas
self.id = canvas.create_oval(10, 10, 25, 25, fill=color)
self.canvas.move(self.id, 245, 100)
self.canvas_height = canvas.winfo_height()
self.x = 0
self.y = -1
def draw(self):
self.canvas.move(self.id, self.x, self.y)
pos = self.canvas.coords(self.id)
if pos[1] <= 0:
self.y = 1
if pos[3] >= self.canvas_height:
self.y = -1
self.canvas.after(2, self.draw)
ball = Ball(canvas, "red")
ball.draw()
root.mainloop()
しかし、内部の時間self.canvas.after()
は正しく動作しません... 1 に設定すると、非常に高速です。10、5、さらには 2 に設定すると、遅すぎます。上記のwhileループをコードで使用している間、問題はありませんでしたtime.sleep()
。
編集:
Tkinter の after 関数内の時間が Windows 8.1 タブレットと Windows 8.1 ラップトップで正しく機能しないことを報告できるようになりましたが、同じラップトップで仮想マシンを介して Ubuntu を実行すると、正常に機能します。