tkinter after如何刷新数据与取消刷新

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()

那问题来了,我们重复点击开始计时按钮还是会出现启动了多个计时器导致倒计时越来越来快,我们应该如何解决呢?
欢迎大家分享思路

PythonTkinter库中,要实现刷新数据的功能,可以使用Tkinter自带的after函数。这个函数可以设定定时执行某个任务的时间。通过调用after函数,可以在指定的时间间隔内刷新数据。这样,在Tkinter的主循环(mainloop)执行期间,可以定时更新界面上的控件数据。 具体实现时,可以先定义一个刷新数据的函数,然后在调用mainloop函数之前,将这个刷新数据函数通过after函数进行定时调用。这样,每当定时器触发时,刷新数据函数就会被执行一次,从而实现数据刷新。以下是一个示例代码: ```python import tkinter as tk def refresh_data(): # 在这里更新需要刷新数据 # 例如,可以更新标签的文本信息或者重新绘制画布等 # 通过递归调用,实现定时刷新数据 root.after(1000, refresh_data) # 这里的1000表示刷新数据的时间间隔,单位为毫秒 # 创建主窗口 root = tk.Tk() # 在调用mainloop函数之前,将刷新数据函数调用一次 refresh_data() # 进入主循环,监听事件 root.mainloop() ``` 在上述示例代码中,refresh_data函数用于更新需要刷新数据。在函数的最后,通过递归调用after函数,实现定时刷新数据的功能。这里的时间间隔设定为1000毫秒,即每隔1秒刷新一次数据。可以根据实际需求调整刷新的时间间隔。 这样,在Tkinter的主循环执行期间,refresh_data函数会被定时调用,从而实现了数据刷新功能。通过在refresh_data函数中更新需要刷新数据,可以实时显示最新的数据信息。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mh_Python_learn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值