打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python tkinter界面卡死的解决办法

python tkinter界面卡死的解决办法

superxgl
于 2022-04-24 23:49:42 发布
1465
收藏 4
分类专栏: Python/Shell/Perl 文章标签: python
版权
79 篇文章 0 订阅
订阅专栏
  1. 如果点击按钮,运行了一个比较耗时的操作,那么界面会卡死。
  2. import tkinter as tk
  3. import time
  4. def onclick(text, i):
  5. time.sleep(3)
  6. text.insert(tk.END, '按了第{}个按钮\n'.format(i))
  7. root = tk.Tk()
  8. text = tk.Text(root)
  9. text.pack()
  10. tk.Button(root, text='按钮1', command=lambda :onclick(text,1)).pack()
  11. tk.Button(root, text='按钮2', command=lambda :onclick(text,2)).pack()
  12. root.mainloop()
  13. 解决办法:
  14. 方式一、直接开线程
  15. import tkinter as tk
  16. import time
  17. import threading
  18. songs = ['爱情买卖','朋友','回家过年','好日子']
  19. movies = ['阿凡达','猩球崛起']
  20. def music(songs):
  21. global text # 故意的,注意与movie的区别
  22. for s in songs:
  23. text.insert(tk.END, "听歌曲:%s \t-- %s\n" %(s, time.ctime()))
  24. time.sleep(3)
  25. def movie(movies, text):
  26. for m in movies:
  27. text.insert(tk.END, "看电影:%s \t-- %s\n" %(m, time.ctime()))
  28. time.sleep(5)
  29. def thread_it(func, *args):
  30. '''将函数打包进线程'''
  31. # 创建
  32. t = threading.Thread(target=func, args=args)
  33. # 守护 !!!
  34. t.setDaemon(True)
  35. # 启动
  36. t.start()
  37. # 阻塞--卡死界面!
  38. # t.join()
  39. root = tk.Tk()
  40. text = tk.Text(root)
  41. text.pack()
  42. tk.Button(root, text='音乐', command=lambda :thread_it(music, songs)).pack()
  43. tk.Button(root, text='电影', command=lambda :thread_it(movie, movies, text)).pack()
  44. root.mainloop()
  45. 方式二、继承 threading.Thread 类
  46. import tkinter as tk
  47. import time
  48. import threading
  49. songs = ['爱情买卖','朋友','回家过年','好日子']
  50. movies = ['阿凡达','猩球崛起']
  51. def music(songs):
  52. global text # 故意的,注意与movie的区别
  53. for s in songs:
  54. text.insert(tk.END, "听歌曲:%s \t-- %s\n" %(s, time.ctime()))
  55. time.sleep(3)
  56. def movie(movies, text):
  57. for m in movies:
  58. text.insert(tk.END, "看电影:%s \t-- %s\n" %(m, time.ctime()))
  59. time.sleep(5)
  60. class MyThread(threading.Thread):
  61. def __init__(self, func, *args):
  62. super().__init__()
  63. self.func = func
  64. self.args = args
  65. self.setDaemon(True)
  66. self.start() # 在这里开始
  67. def run(self):
  68. self.func(*self.args)
  69. root = tk.Tk()
  70. text = tk.Text(root)
  71. text.pack()
  72. tk.Button(root, text='音乐', command=lambda :MyThread(music, songs)).pack()
  73. tk.Button(root, text='电影', command=lambda :MyThread(movie, movies, text)).pack()
  74. root.mainloop()
  75. 三、或者,搞一个界面类:
  76. import tkinter as tk
  77. import time
  78. import threading
  79. songs = ['爱情买卖','朋友','回家过年','好日子']
  80. films = ['阿凡达','猩球崛起']
  81. class Application(tk.Tk):
  82. def __init__(self):
  83. super().__init__()
  84. self.createUI()
  85. # 生成界面
  86. def createUI(self):
  87. self.text = tk.Text(self)
  88. self.text.pack()
  89. tk.Button(self, text='音乐', command=lambda :self.thread_it(self.music, songs)).pack(expand=True, side=tk.RIGHT) # 注意lambda语句的作用!
  90. tk.Button(self, text='电影', command=lambda :self.thread_it(self.movie, films)).pack(expand=True, side=tk.LEFT)
  91. # 逻辑:听音乐
  92. def music(self, songs):
  93. for x in songs:
  94. self.text.insert(tk.END, "听歌曲:%s \t-- %s\n" %(x, time.ctime()))
  95. print("听歌曲:%s \t-- %s" %(x, time.ctime()))
  96. time.sleep(3)
  97. # 逻辑:看电影
  98. def movie(self, films):
  99. for x in films:
  100. self.text.insert(tk.END, "看电影:%s \t-- %s\n" %(x, time.ctime()))
  101. print("看电影:%s \t-- %s" %(x, time.ctime()))
  102. time.sleep(5)
  103. # 打包进线程(耗时的操作)
  104. @staticmethod
  105. def thread_it(func, *args):
  106. t = threading.Thread(target=func, args=args)
  107. t.setDaemon(True) # 守护--就算主界面关闭,线程也会留守后台运行(不对!)
  108. t.start() # 启动
  109. # t.join() # 阻塞--会卡死界面!
  110. app = Application()
  111. app.mainloop()
  112. 原文参考:https://www.cnblogs.com/hhh5460/p/5186819.html 致敬
  113. 希望对你有帮助
文章知识点与官方知识档案匹配,可进一步学习相关知识
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
利用Python打造一个语音合成系统
某培训学员总结Python入门知识合集,厚着脸皮讨要过来分享了!
Python|GUI编程中Entry部件详解
20组常用的python代码!速速码了备用~
用Python创建你第一个GIS程序[5]:多进程解决线程堵塞
tkinter模块常用参数(python3)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服