当前位置: 首页 >服务端 > tkinter界面卡死的解决办法

tkinter界面卡死的解决办法

 0、如果点击按钮,运行了一个比较耗时的操作,那么界面会卡死

import tkinter as tkimport timedef onclick(text, i):time.sleep(3)text.insert(tk.END, '按了第{}个按钮\n'.format(i))  root = tk.Tk()text = tk.Text(root)text.pack()tk.Button(root, text='按钮1', command=lambda :onclick(text,1)).pack()tk.Button(root, text='按钮2', command=lambda :onclick(text,2)).pack()root.mainloop()

 

tkinter界面卡死的解决办法 _ JavaClub全栈架构师技术笔记

解决办法:

方式一、直接开线程

import tkinter as tkimport timeimport threadingsongs = ['爱情买卖','朋友','回家过年','好日子']movies = ['阿凡达','猩球崛起']def music(songs):global text # 故意的,注意与movie的区别for s in songs:text.insert(tk.END, "听歌曲:%s \t-- %s\n" %(s, time.ctime()))time.sleep(3)def movie(movies, text):for m in movies:text.insert(tk.END, "看电影:%s \t-- %s\n" %(m, time.ctime()))time.sleep(5)def thread_it(func, *args):'''将函数打包进线程'''# 创建t = threading.Thread(target=func, args=args) # 守护 !!!t.setDaemon(True) # 启动t.start()# 阻塞--卡死界面!# t.join()root = tk.Tk()text = tk.Text(root)text.pack()tk.Button(root, text='音乐', command=lambda :thread_it(music, songs)).pack()tk.Button(root, text='电影', command=lambda :thread_it(movie, movies, text)).pack()root.mainloop()

 

方式二、继承 threading.Thread 类

import tkinter as tkimport timeimport threadingsongs = ['爱情买卖','朋友','回家过年','好日子']movies = ['阿凡达','猩球崛起']def music(songs):global text # 故意的,注意与movie的区别for s in songs:text.insert(tk.END, "听歌曲:%s \t-- %s\n" %(s, time.ctime()))time.sleep(3)def movie(movies, text):for m in movies:text.insert(tk.END, "看电影:%s \t-- %s\n" %(m, time.ctime()))time.sleep(5)class MyThread(threading.Thread):def __init__(self, func, *args):super().__init__()self.func = funcself.args = argsself.setDaemon(True)self.start()# 在这里开始def run(self):self.func(*self.args)root = tk.Tk()text = tk.Text(root)text.pack()tk.Button(root, text='音乐', command=lambda :MyThread(music, songs)).pack()tk.Button(root, text='电影', command=lambda :MyThread(movie, movies, text)).pack()root.mainloop()

 

三、或者,搞一个界面类:

import tkinter as tkimport timeimport threadingsongs = ['爱情买卖','朋友','回家过年','好日子'] 
films = ['阿凡达','猩球崛起']

class Application(tk.Tk):def __init__(self):super().__init__()self.createUI()# 生成界面def createUI(self):self.text = tk.Text(self)self.text.pack()tk.Button(self, text='音乐', command=lambda :self.thread_it(self.music, songs)).pack(expand=True, side=tk.RIGHT) # 注意lambda语句的作用!tk.Button(self, text='电影', command=lambda :self.thread_it(self.movie, films)).pack(expand=True, side=tk.LEFT)# 逻辑:听音乐def music(self, songs):for x in songs:self.text.insert(tk.END, "听歌曲:%s \t-- %s\n" %(x, time.ctime()))print("听歌曲:%s \t-- %s" %(x, time.ctime()))time.sleep(3)# 逻辑:看电影def movie(self, films):for x in films:self.text.insert(tk.END, "看电影:%s \t-- %s\n" %(x, time.ctime()))print("看电影:%s \t-- %s" %(x, time.ctime()))time.sleep(5)# 打包进线程(耗时的操作)@staticmethoddef thread_it(func, *args):t = threading.Thread(target=func, args=args) t.setDaemon(True)# 守护--就算主界面关闭,线程也会留守后台运行(不对!)t.start()# 启动# t.join() # 阻塞--会卡死界面!app = Application()app.mainloop()

 

作者:罗兵
来源链接:https://www.cnblogs.com/hhh5460/p/5186819.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/server/113406.html

标签:解决办法
分享给朋友:

“tkinter界面卡死的解决办法” 的相关文章