rsj0315 发表于 2023-12-14 22:09:45

悬浮倒计时--优化2

在现有功能基础上,需要排除下边这个bug;
第一次启动倒计时后,时间倒数正常;在第一次计时未结束时重新输入倒计时时间后,更新时间的频率有bug

import tkinter as tk
class CountdownTimer:
    def __init__(self):
      self.duration = 0
      self.root = tk.Tk()
      self.root.overrideredirect(1)# 隐藏标题栏
      self.root.attributes("-alpha", 0.2)# 设置透明度
      self.root.attributes("-topmost", True)# 窗口置顶
      # 获取屏幕宽高
      screen_width = self.root.winfo_screenwidth()
      screen_height = self.root.winfo_screenheight()
      # 创建输入框并添加到窗口
      self.entry = tk.Entry(self.root)
      self.entry.pack()
      # 绑定回车事件
      self.entry.bind("<Return>", self.start_countdown)
      # 计算窗口位置
      x = 0
      y = 0
      # 创建标签并添加到窗口
      self.label = tk.Label(self.root, text=self.get_time(), font=("Arial", 36))
      self.label.pack()
      # 设置窗口位置
      self.root.geometry("+{}+{}".format(500, 500))
      # 更新倒计时
      self.update_timer()

      # 绑定鼠标事件
      self.drag_start_x = 0
      self.drag_start_y = 0
      self.root.bind("<ButtonPress-1>", self.on_drag_start)
      self.root.bind("<B1-Motion>", self.on_drag_motion)
    def update_timer(self):
      if self.duration > 0:
            self.duration -= 1
            self.label.config(text=self.get_time())
            self.root.after(1000, self.update_timer)
      else:
            pass
            # self.root.destroy()
    def get_time(self):
      minutes = self.duration // 60
      seconds = self.duration % 60
      return "{:02d}:{:02d}".format(minutes, seconds)
    def on_drag_start(self, event):
      self.drag_start_x = event.x
      self.drag_start_y = event.y
    def on_drag_motion(self, event):
      x = self.root.winfo_x() + (event.x - self.drag_start_x)
      y = self.root.winfo_y() + (event.y - self.drag_start_y)
      self.root.geometry("+{}+{}".format(x, y))
    def start_countdown(self, event):
      try:
            duration = int(self.entry.get())
            # 更新倒计时
            self.duration = duration
            self.update_timer()


      except ValueError:
            # 处理非法输入的情况
            print("请输入一个有效的数值")
countdown_timer = CountdownTimer()
countdown_timer.root.mainloop()

FishC 发表于 2023-12-14 22:10:06

在start_countdown方法中,您需要将self.duration的值更新为duration。修改后的代码如下:

def start_countdown(self, event):
    try:
      duration = int(self.entry.get())
      #更新倒计时
      self.duration = duration
      self.update_timer()

    except ValueError:
      #处理非法输入的情况
      print("请输入一个有效的数值")

在if self.duration > 0:的条件下,每次调用update_timer时都会减少self.duration的值,直至为0。因此,在第一次计时未结束时重新输入倒计时时间后,新的倒计时会将原先的倒计时替换掉,而不是继续计时。这是导致"更新时间的频率有bug"的原因。

为了解决这个问题,可以添加一个标志位is_counting用于判断当前是否正在进行倒计时。只有当is_counting为False时,才更新倒计时时间,并将is_counting置为True。

以下是修改后的代码:

class CountdownTimer:
    def __init__(self):
      self.is_counting = False
      ...
      
    def update_timer(self):
      if self.duration > 0 and self.is_counting:
            self.duration -= 1
            self.label.config(text=self.get_time())
            self.root.after(1000, self.update_timer)
      else:
            self.is_counting = False
            #self.root.destroy()
   
    def start_countdown(self, event):
      try:
            duration = int(self.entry.get())
            if not self.is_counting:
                self.duration = duration
                self.update_timer()
                self.is_counting = True
               
      except ValueError:
            #处理非法输入的情况
            print("请输入一个有效的数值")

通过添加is_counting标志位,并在start_countdown方法中根据is_counting的值进行相应的操作,可以排除该bug。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 悬浮倒计时--优化2