问题1:tkinter的事件运行时间长,界面卡住无响应的问题。
问题解析,tkinter的运行是一个死循环。
from tkinter import *
root = Tk()
root.mainloop()
这个循环开始后,只有我们设置的事件中断。但如果,设置了一个按钮,绑定一个函数,这个函数执行的时间需要5秒钟。那么这个root.mainloop()的循环就要暂停5秒,在界面上看上去就是卡住了。
解决方式是事件绑定一个函数,这个让函数开启一个线程,然后返回,界面就不会卡住。
from tkinter import *
import time
import threading
def clock1():
for i in range(1,100):
time.sleep(1)
text.configure(text = str(i))
def timerbg():
timer = threading.Thread(target=clock1)
timer.daemon =True
timer.start()
return
root = Tk()
fram = Frame().pack()
text = Label(fram,text='0')
text.pack()
button = Button(fram,text='timer',command=timerbg).pack()
root.mainloop()
问题2、tkinter定时任务 root.after。
当然可以用子线程来解决。但Tk.after()方法可以在mainloop循环开始后调用这个方法,然后可以构建在回调,实现mainloop循环中处理一些数据。
from tkinter import *
def timerstop():
global timer
timer = False
timer = True
root = Tk()
fram = Frame().pack()
text = Label(fram,text='0')
text.pack()
button = Button(fram,text='timer',command=timerstop).pack()
count = 0
def getdata():
global count,timer
count += 1
if timer:
text.configure(text = str(count))
root.after(1000,getdata)
root.after(0,getdata)
root.mainloop()
root.after() 是在mainloop循环后多少毫秒,调用某个函数。调用的函数最后在加一句:
root.after(1000,getdata)
就构成了一个循环下的循环。需要注意的是如果这个函数比如上面的 getdata()不能写成:
root.after(1000,getdata())
这样python会报错 maximum recursion depth exceeded。超出了最大递归次数。如果非要这样写,比如需要传参数,可以这样写:
root.after(1000,lambda:getdata())
不管怎样,可以运行了。