簡體   English   中英

讓after()方法按時運行Tkinter

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM