python学习笔记 tkinter界面、后台同步问题

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

不管怎样,可以运行了。

你可能感兴趣的:(python学习笔记)