[英]Have after() method run on time Tkinter
我正在編程一個工具,該工具必須使用python在Tkinter中顯示精度為1/100秒的計時器。 我嘗試將after()
方法與self.timerLabel.after(0, self.update_timer)
def update_timer (self):
self.timer += 0.01
self.timerLabel.configure(text="%.2f" % self.timer)
self.timerLabel.after(10, self.update_timer)
問題是它的運行速度比預期的慢,我需要知道是否存在解決方法或某種方式使計時器准確地按時運行。 或者,可以使用某種方式使用計算機的時間在屏幕上顯示正確的經過時間。 先感謝您
最准確的方法可能是找到開始時間,然后每次調用更新計時器功能時,只需從當前時間中減去開始時間即可。
我附加了一些示例代碼,向您大致展示了它的工作方式。 使它適應Tkinter
after()
應該很簡單。
import time
# Start time
startTime = time.time();
def update_timer():
# Find difference and print
timeDifference = time.time() - startTime;
print(timeDifference);
# Sleep appropriate amount of time before printing
# next statement.
time.sleep(0.1);
# Recursively call update.
update_timer();
# Start running
update_timer();
小提琴示例: https : //repl.it/Hoqh/0
after
命令不作任何保證,除非它不會在給定時間段之前執行。 Tkinter不是實時系統。
您還必須考慮執行代碼所需的時間。 例如,假設您的命令正好按時啟動。 在該代碼中,您有兩行代碼:
self.timer += 0.01
self.timerLabel.configure(text="%.2f" % self.timer)
該代碼需要花費一些時間才能執行。 可能只有幾微秒,但絕對超過零微秒。
然后調用after
再次:
self.timerLabel.after(10, self.update_timer)
下次運行將在當前時間之后至少10毫秒,這是調用后的幾微秒或毫秒。 因此,如果前兩個命令花費1毫秒,那么下次調用時將是第一次調用之后的11毫秒(延遲為10毫秒,執行代碼為1毫秒)
你可以通過調用最小化延遲因素一點after
立即,而不是等待代碼的其余部分執行。 只要延遲大於執行其他代碼所花費的時間,您就會注意到有一點改進:
def update_timer (self):
self.timerLabel.after(10, self.update_timer)
self.timer += 0.01
self.timerLabel.configure(text="%.2f" % self.timer)
這仍然是不精確的,因為還有其他一些因素可以阻止self.timer在被請求后的10ms內准確調用。 例如,如果調整窗口大小或在9.99ms處移動窗口,則tkinter必須先處理重繪,然后才能處理計划的任務。
如果要考慮所有這些漂移,不要每次都自動增加10ms。 而是,計算每次調用之間的時間,並添加增量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.