はTkinterの単純な移動を行うために試み:Y移動用のX移動のための1つ、およびもう:self.momentum
2つの整数を含む配列であるなぜTkinterのこのシェイプはゆっくり更新されますか?
import tkinter as tk
class GameApp(object):
"""
An object for the game window.
Attributes:
master: Main window tied to the application
canvas: The canvas of this window
"""
def __init__(self, master):
"""
Initialize the window and canvas of the game.
"""
self.master = master
self.master.title = "Game"
self.master.geometry('{}x{}'.format(500, 500))
self.canvas = tk.Canvas(self.master)
self.canvas.pack(side="top", fill="both", expand=True)
self.start_game()
#----------------------------------------------#
def start_game(self):
"""
Actual loading of the game.
"""
player = Player(self)
#----------------------------------------------#
#----------------------------------------------#
class Player(object):
"""
The player of the game.
Attributes:
color: color of sprite (string)
dimensions: dimensions of the sprite (array)
canvas: the canvas of this sprite (object)
window: the actual game window object (object)
momentum: how fast the object is moving (array)
"""
def __init__(self, window):
self.color = ""
self.dimensions = [225, 225, 275, 275]
self.window = window
self.properties()
#----------------------------------------------#
def properties(self):
"""
Establish the properties of the player.
"""
self.color = "blue"
self.momentum = [5, 0]
self.draw()
self.mom_calc()
#----------------------------------------------#
def draw(self):
"""
Draw the sprite.
"""
self.sprite = self.window.canvas.create_rectangle(*self.dimensions, fill=self.color, outline=self.color)
#----------------------------------------------#
def mom_calc(self):
"""
Calculate the actual momentum of the thing
"""
self.window.canvas.move(self.sprite, *self.momentum)
self.window.master.after(2, self.mom_calc)
#----------------------------------------------#
#----------------------------------------------#
root = tk.Tk()
game_window = GameApp(root)
。しかし、矩形の実際の動きは実際には遅いです(1秒あたり約5回の動き)、self.window.master.after()
の時間は効果がないようです。
これまでの別のtkinterプロジェクトでは、私は本当に反応したtkinterの動きを得ることができたので、私は、この場合、時間の更新を最小限に抑える方法があるかどうか、まったく異なるコードであってもよい。
更新:.after()
メソッドの時刻は重要ですが、実際にはメソッドのリアルタイムにスタックされます。メソッドの呼び出し時にtimeit
を使用した後、私はこの出力を得た:
>>> print(timeit.timeit("(self.window.master.after(2, self.mom_calc))", number=10000, globals={"self":self}))
0.5395521819053108
だから私は、本当の問題があると思います:なぜそれ.after()
方法はそう長く取っていますか?
更新2:複数のコンピュータでテストしたところ、いずれのプラットフォームでも動きはまだ遅いです。
これはprobemを説明するために必要以上の方法より多くのコードのようになります。ここでは
は(わずかに)変更されたコードです。以下のアドバイスを読んで、それに従ってください:[最小限で完全で検証可能なサンプルを作成する方法](http://stackoverflow.com/help/mcve)、または質問をhttp://codereview.stackexchange.com/に移動してください –これを最小化しました。 – Dova
「最小、完全、および検証可能」の「完全」部分を忘れてしまった。 –