tkinter after如何刷新数据与取消刷新
在tkinter软件设计中,我们时常需要去不停的去刷新我们想要的数据部分,我们以标签计时器为案例来讲解tkinter如何刷新数据
import tkinter as t
class mian():
def __init__(self,a):
self.wind=a
self.wind.geometry("800x600")
self.bk = t.Canvas(wind, width=800, height=600, bg="lightyellow")
self.bk.place(x=0, y=0)
self.btn = t.Button(self.bk, text="开始计时", bg="yellow", font="Helvetic 20 bold", width=10, command=self.djs)
self.btn.place(x=20, y=180)
self.btn1 = t.Button(self.bk, text="取消计时", bg="yellow", font="Helvetic 20 bold", width=10, command=self.end)
self.btn1.place(x=20, y=280)
self.num = 10
self.num_lab = t.Label(self.bk, text=self.num, bg="yellow", font="Helvetic 20 bold", width=10)
self.num_lab.place(x=400, y=180)
def djs(self):
pass
def end(self):
pass
wind=t.Tk()
mian(wind)
wind.mainloop()
我们先建立一个窗口界面,此时开始计时按钮和结束及时按钮是是没有添加功能的
我们此时添加计时的程序after
def djs(self):
self.num_lab.place_forget()
self.num_lab = t.Label(self.bk, text=self.num, bg="yellow", font="Helvetic 20 bold", width=10)
self.num_lab.place(x=400, y=180)
self.s=self.bk.after(1000,self.jian)
def jian(self):
self.num-=1
self.djs()
子函数功能添加代码所示,本质上是函数djs和jian之间每过一秒进行跳转,这里需要注意的是,如果你再次点击开始及时,我们的计时器会又重新启动一次,因为整个软件为消息循环,每点击按钮一次,我们的这个self.s计时器的动作就启动一次,你会发现倒计时不再是1s一次了,而是越来越快,将计时器取消,我们可以解决这个问题
def end(self):
self.bk.after_cancel(self.s)
self.num=10
自定义函数end连接的是我们的取消计时按钮,当我们点击取消计时时,出发after_cancel指令,取消计时器。
完整代码如下:
import tkinter as t
class mian():
def __init__(self,a):
self.wind=a
self.wind.geometry("800x600")
self.bk = t.Canvas(wind, width=800, height=600, bg="lightyellow")
self.bk.place(x=0, y=0)
self.btn = t.Button(self.bk, text="开始计时", bg="yellow", font="Helvetic 20 bold", width=10, command=self.djs)
self.btn.place(x=20, y=180)
self.btn1 = t.Button(self.bk, text="取消计时", bg="yellow", font="Helvetic 20 bold", width=10, command=self.end)
self.btn1.place(x=20, y=280)
self.num = 10
self.num_lab = t.Label(self.bk, text=self.num, bg="yellow", font="Helvetic 20 bold", width=10)
self.num_lab.place(x=400, y=180)
def djs(self):
self.num_lab.place_forget()
self.num_lab = t.Label(self.bk, text=self.num, bg="yellow", font="Helvetic 20 bold", width=10)
self.num_lab.place(x=400, y=180)
self.s=self.bk.after(1000,self.jian)
def jian(self):
self.num-=1
self.djs()
def end(self):
self.bk.after_cancel(self.s)
self.num=10
wind=t.Tk()
mian(wind)
wind.mainloop()
那问题来了,我们重复点击开始计时按钮还是会出现启动了多个计时器导致倒计时越来越来快,我们应该如何解决呢?
欢迎大家分享思路