【问题标题】:My one minute progress bar in Tkinter gets less and less accurate every time it loops每次循环时,我在 Tkinter 中的一分钟进度条变得越来越不准确
【发布时间】:2020-08-25 01:08:02
【问题描述】:

更多细节:我想做的是一个一分钟长的进度条,一旦一分钟结束,它会重新启动并循环。顶部的代码用于在新的一分钟开始时自动启动进程。问题是栏同步并自行启动很好,但一两分钟后它开始变慢几秒钟,最令人困惑的部分是它根本不一致,它以不同的速度变慢每次我运行它。任何帮助将不胜感激。

这是我的代码:

import time
from tkinter import *
import datetime as dt
from tkinter.ttk import *

now = dt.datetime.now()
sync_now = '%02d:%02d:%02d' % (now.hour, now.minute, now.second)
sync_now_object = dt.datetime.strptime(sync_now, '%H:%M:%S').time()
second_of_day = int(now.hour * 60 * 60 + now.minute * 60 + now.second)
second_of_day = int(second_of_day / 60) * 60 + 60
hour = int(second_of_day / 60 / 60)
minute = int((second_of_day % (60 * 60)) / 60)
second = int(second_of_day % 60)
target_time = dt.time(hour, minute, second)
target_time_str = str(target_time)
print(target_time)
print(sync_now)

def time_to_num(time_str):
 hh, mm , ss = map(int, time_str.split(':'))
 return ss + 60*(mm + 60*hh)

difference_target_now=time_to_num(target_time_str)-time_to_num(sync_now)
print(difference_target_now)
after_difference = difference_target_now*1000
print(after_difference)

# creating Tk window
app = Tk()
app.wm_attributes('-topmost', 1)

# setting geometry of tk window
app.geometry("600x100")

# Using title() to display a message in
# the dialogue box of the message in the
# title bar.
app.title("")

progress = Progressbar(app, orient=HORIZONTAL,
                    length=600, mode='determinate')
def my_progress():
   progress['maximum'] = 60
   progress['value'] = 1
   app.update()
   time.sleep(1)

   progress['value'] = 2
   app.update()
   time.sleep(1)

   progress['value'] = 3
   app.update()
   time.sleep(1)

   progress['value'] = 4
   app.update()
   time.sleep(1)

   progress['value'] = 5
   app.update()
   time.sleep(1)

   progress['value'] = 6
   app.update()
   time.sleep(1)

   progress['value'] = 7
   app.update()
   time.sleep(1)

   progress['value'] = 8
   app.update()
   time.sleep(1)

   progress['value'] = 9
   app.update()
   time.sleep(1)

   progress['value'] = 10
   app.update()
   time.sleep(1)

   progress['value'] = 11
   app.update()
   time.sleep(1)

   progress['value'] = 12
   app.update()
   time.sleep(1)

   progress['value'] = 13
   app.update()
   time.sleep(1)

   progress['value'] = 14
   app.update()
   time.sleep(1)

   progress['value'] = 15
   app.update()
   time.sleep(1)

   progress['value'] = 16
   app.update()
   time.sleep(1)

   progress['value'] = 17
   app.update()
   time.sleep(1)

   progress['value'] = 18
   app.update()
   time.sleep(1)

   progress['value'] = 19
   app.update()
   time.sleep(1)

   progress['value'] = 20
   app.update()
   time.sleep(1)

   progress['value'] = 21
   app.update()
   time.sleep(1)

   progress['value'] = 22
   app.update()
   time.sleep(1)

   progress['value'] = 23
   app.update()
   time.sleep(1)

   progress['value'] = 24
   app.update()
   time.sleep(1)

   progress['value'] = 25
   app.update()
   time.sleep(1)

   progress['value'] = 26
   app.update()
   time.sleep(1)

   progress['value'] = 27
   app.update()
   time.sleep(1)

   progress['value'] = 28
   app.update()
   time.sleep(1)

   progress['value'] = 29
   app.update()
   time.sleep(1)

   progress['value'] = 30
   app.update()
   time.sleep(1)

   progress['value'] = 31
   app.update()
   time.sleep(1)

   progress['value'] = 32
   app.update()
   time.sleep(1)

   progress['value'] = 33
   app.update()
   time.sleep(1)

   progress['value'] = 34
   app.update()
   time.sleep(1)

   progress['value'] = 35
   app.update()
   time.sleep(1)

   progress['value'] = 36
   app.update()
   time.sleep(1)

   progress['value'] = 37
   app.update()
   time.sleep(1)

   progress['value'] = 38
   app.update()
   time.sleep(1)

   progress['value'] = 39
   app.update()
   time.sleep(1)

   progress['value'] = 40
   app.update()
   time.sleep(1)

   progress['value'] = 41
   app.update()
   time.sleep(1)

   progress['value'] = 42
   app.update()
   time.sleep(1)

   progress['value'] = 43
   app.update()
   time.sleep(1)

   progress['value'] = 44
   app.update()
   time.sleep(1)

   progress['value'] = 45
   app.update()
   time.sleep(1)

   progress['value'] = 46
   app.update()
   time.sleep(1)

   progress['value'] = 47
   app.update()
   time.sleep(1)

   progress['value'] = 48
   app.update()
   time.sleep(1)

   progress['value'] = 49
   app.update()
   time.sleep(1)

   progress['value'] = 50
   app.update()
   time.sleep(1)

   progress['value'] = 51
   app.update()
   time.sleep(1)

   progress['value'] = 52
   app.update()
   time.sleep(1)

   progress['value'] = 53
   app.update()
   time.sleep(1)

   progress['value'] = 54
   app.update()
   time.sleep(1)

   progress['value'] = 55
   app.update()
   time.sleep(1)

   progress['value'] = 56
   app.update()
   time.sleep(1)

   progress['value'] = 57
   app.update()
   time.sleep(1)

   progress['value'] = 58
   app.update()
   time.sleep(1)

   progress['value'] = 59
   app.update()
   time.sleep(1)

   progress['value'] = 60
   app.update()
   time.sleep(1)

   app.after(0, my_progress)
progress.pack()

app.after(after_difference, my_progress)
app.mainloop()

【问题讨论】:

  • sleep() 会阻止tkinter.mainloop(),所以最好改用after()

标签: python tkinter progress-bar


【解决方案1】:

两件重要的事情:

  • time.sleep(1) 睡眠至少一秒钟。这不是一个精确的计时器。
  • 更新进度条也需要时间,这进一步减慢了进程

在您的代码中,有这样的块:

progress['value'] = 1
app.update()   # this takes time
time.sleep(1)   # more than 1 second

组合其中的 60 个肯定需要一分钟以上的时间。

要获得更高的精度,请使用开始时间和当前时间之间的时间差,并相应地设置进度条。

这是更新的代码。它每 1/10 秒检查一次时间差并更新进度条。

def my_progress():
   progress['maximum'] = 60
   start = dt.datetime.now()
   while True:
       diff = (dt.datetime.now() - start).total_seconds()  # seconds since bar start
       progress['value'] = diff  # can also use int(diff) to jump 1 sec
       app.update()
       time.sleep(0.1)  # 1/10 second
       if (diff > 60):  # end of bar
          start = dt.datetime.now()  # restart progress

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多