Tkinter: メインループの役割を理解する
Tkinter の Tk() ウィジェットでは、ウィジェットを表示し、ユーザー操作を処理するために mainloop メソッドが必要です。ただし、連続アニメーションなどの一部のシナリオでは、代替ループが必要です。
メインループの代替: update_idletasks() および update()
update_idletasks()このメソッドは、プログラムをブロックせずに、ウィジェットの再描画などのスケジュールされたアイドル イベントを処理します。一方、update() メソッドは、アイドル イベントを含むすべての保留中のイベントを処理します。
メインループとは異なり、以下のループはブロックされません:
while 1: ball.draw() tk.update_idletasks() tk.update()
ただし、このループはmainloop() の代替ではなく、ユーザー操作を処理しません。 Mainloop() は Tcl イベント ループに繰り返し入り、アイドル コールバックを含むすべてのイベントを処理し、ウィジェットがユーザー入力に応答できるようにします。
無限ループの回避
無限ループには問題がありますウィジェットがイベントに応答できなくなるため、GUI プログラミングで使用されます。ブロックせずにタスクを繰り返し実行するには、Tkinter の after() メソッドを使用します。
self.canvas.after(1, self.draw) # (time_delay, method_to_execute)
After() は別の実行スレッドを作成し、mainloop() を含む他のメソッドを同時に実行できるようにします。
応答性と対話型の例
次の例は、マウスクリックを処理するノンブロッキングアニメーション:
class Ball: def canvas_onclick(self, event): print("You clicked at ({}, {})".format(event.x, event.y)) def draw(self): self.canvas.move(self.id, 0, -1) self.canvas.after(50, self.draw) # Schedule self.draw to run after 50 milliseconds ball = Ball(canvas, "red") ball.draw() # Start the animation # Create a main window and enter the Tcl event loop root = Tk() root.mainloop()
以上がTkinter メインループの代替案: 代わりに `update_idletasks()` と `update()` を使用する場合は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。