4

まず、私の前のスレッドを見てください: 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 を実行すると、正常に機能します。

4

2 に答える 2

0

time.sleep の時間は秒単位ですが、after() の時間はミリ秒単位です。time.sleep(0.01) は、self.canvas.after(10, self.draw) と同じです。after(2, func) が遅すぎて after(1, func) が速すぎる場合は、sleep(0.0005) を試してから after(1, func) で 1.5 ミリ秒の遅延を与えることができますが、ほとんど目立ちません。いずれにせよ、一時停止が正しくなるまでタイミングをいじります。

于 2015-08-25T11:37:38.730 に答える