試圖做在Tkinter的簡單的動作:爲什麼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)
哪裏self.momentum
是含有2個整數的數組:一個用於x運動,和另一個用於y運動。但是,矩形的實際移動非常緩慢(每秒大約5次移動),而self.window.master.after()
時間似乎沒有效果。
以前在另一個tkinter項目中,我設法得到了真正響應的tkinter運動,所以我只是想知道是否有辦法在這種情況下最小化運動更新時間,方法是使用不同風格的OOP,或者完全不同的代碼。
UPDATE:原來在.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
您忘記了「最低,完整和可驗證」的「完整」部分。 –