tkinter界面卡死的解决办法

 

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

  1. import tkinter as tk
  2. import time
  3.  
  4. def onclick(text, i):
  5. time.sleep(3)
  6. text.insert(tk.END, '按了第{}个按钮\n'.format(i))
  7.  
  8. root = tk.Tk()
  9.  
  10. text = tk.Text(root)
  11. text.pack()
  12.  
  13. tk.Button(root, text='按钮1', command=lambda :onclick(text,1)).pack()
  14. tk.Button(root, text='按钮2', command=lambda :onclick(text,2)).pack()
  15.  
  16. root.mainloop()

解决办法:

方式一、直接开线程

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

方式二、继承 threading.Thread 类

  1. import tkinter as tk
  2. import time
  3. import threading
  4.  
  5. songs = ['爱情买卖','朋友','回家过年','好日子']
  6. movies = ['阿凡达','猩球崛起']
  7.  
  8. def music(songs):
  9. global text # 故意的,注意与movie的区别
  10. for s in songs:
  11. text.insert(tk.END, "听歌曲:%s \t-- %s\n" %(s, time.ctime()))
  12. time.sleep(3)
  13.  
  14. def movie(movies, text):
  15. for m in movies:
  16. text.insert(tk.END, "看电影:%s \t-- %s\n" %(m, time.ctime()))
  17. time.sleep(5)
  18.  
  19. class MyThread(threading.Thread):
  20. def __init__(self, func, *args):
  21. super().__init__()
  22.  
  23. self.func = func
  24. self.args = args
  25.  
  26. self.setDaemon(True)
  27. self.start() # 在这里开始
  28.  
  29. def run(self):
  30. self.func(*self.args)
  31.  
  32. root = tk.Tk()
  33.  
  34. text = tk.Text(root)
  35. text.pack()
  36.  
  37. tk.Button(root, text='音乐', command=lambda :MyThread(music, songs)).pack()
  38. tk.Button(root, text='电影', command=lambda :MyThread(movie, movies, text)).pack()
  39.  
  40. root.mainloop()

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

  1. import tkinter as tk
  2. import time
  3. import threading
  4.  
  5. songs = ['爱情买卖','朋友','回家过年','好日子']
  6.  
  7. films = ['阿凡达','猩球崛起']
  8.  
  9. class Application(tk.Tk):
  10. def __init__(self):
  11. super().__init__()
  12.  
  13. self.createUI()
  14.  
  15. # 生成界面
  16. def createUI(self):
  17. self.text = tk.Text(self)
  18. self.text.pack()
  19.  
  20. tk.Button(self, text='音乐', command=lambda :self.thread_it(self.music, songs)).pack(expand=True, side=tk.RIGHT) # 注意lambda语句的作用!
  21. tk.Button(self, text='电影', command=lambda :self.thread_it(self.movie, films)).pack(expand=True, side=tk.LEFT)
  22.  
  23. # 逻辑:听音乐
  24. def music(self, songs):
  25. for x in songs:
  26. self.text.insert(tk.END, "听歌曲:%s \t-- %s\n" %(x, time.ctime()))
  27. print("听歌曲:%s \t-- %s" %(x, time.ctime()))
  28. time.sleep(3)
  29.  
  30. # 逻辑:看电影
  31. def movie(self, films):
  32. for x in films:
  33. self.text.insert(tk.END, "看电影:%s \t-- %s\n" %(x, time.ctime()))
  34. print("看电影:%s \t-- %s" %(x, time.ctime()))
  35. time.sleep(5)
  36.  
  37. # 打包进线程(耗时的操作)
  38. @staticmethod
  39. def thread_it(func, *args):
  40. t = threading.Thread(target=func, args=args)
  41. t.setDaemon(True) # 守护--就算主界面关闭,线程也会留守后台运行(不对!)
  42. t.start() # 启动
  43. # t.join() # 阻塞--会卡死界面!
  44.  
  45. app = Application()
  46. app.mainloop()

tkinter页面卡死的更多相关文章

  1. 嵌套ajax 页面卡死的问题

    问题:要一个AJAX中的回调函数中又进行了一个AJAX调用,并且这个AJAX是在一个循环调用的,不论设置async属性是true和false页面卡死. 解决方法:async属性都设为true,不用循环 ...

  2. 记一次H5页面卡死的BUG

    之前有次开发小程序内嵌页面,类似于网易星球那种,很多钻石可以手动点击收取. 该页面css动效非常多,几乎页面上除了纯色背景之外全部有动效. 也正因为如此,才做成了小程序内嵌的形式(太大了). 当多次快 ...

  3. ajax 多个setInterval进行ajax请求的页面长时间打开会出现页面卡死问题

     多个setInterval进行ajax请求的页面长时间打开会出现页面卡死问题 浏览器的渲染(UI)线程和js线程是互斥的,在执行js耗时操作时,页面渲染会被阻塞掉.当我们执行异步ajax的时候没有问 ...

  4. JavaScript 上万条数据 导出Excel文件 页面卡死

    最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var  ...

  5. tkinter界面卡死的解决办法

    0.如果点击按钮,运行了一个比较耗时的操作,那么界面会卡死 import tkinter as tk import time def onclick(text, i): time.sleep(3) t ...

  6. iOS 第一次安装应用,拒绝相机调用,页面卡死的解决方案

    void (^allowBlock)() = ^{ UIImagePickerController *imagePicker = [[UIImagePickerController alloc] in ...

  7. Myeclipse10打开jsp页面卡死问题

    在Myeclipse的选项中.General->Editor->File Associations.在上边找到*.jsp.在下边设置Myeclipse JSP Editer为默认编辑器.以 ...

  8. 移动端H5页面遇到的问题总结

    最近刚做完一个移动端的项目,产品之无敌,过程之艰辛,我就不多说了,记录下在这个项目中遇到的问题,以防万一,虽然这些可能都是已经被N多前辈解决掉了的问题,也放在这里,算是为自己漫漫前端路铺了一颗小石子儿 ...

  9. IE之页面加载慢.

    场景 场景是大屏页面一张深色背景, 里面一些文本元素以及图表展示. 结果在IE下发现加载异常缓慢, 还有部分人员反馈页面卡死. 后台读写优化 默认处理图片逻辑是, ImageIO读取原图, 转成byt ...

随机推荐

  1. Linux ps和pstree命令

    1. 查看所有进程 ps -eF -e: Select all processes.-F: Extra full format. PSR (Processor)显示进程所在的CPU. 2. 查看所有进 ...

  2. Java Web 笔记(1)

    JavaWeb 学习笔记,狂神说java,链接:https://www.bilibili.com/video/av68833391 Java Web 1.基本概念 1.1.前言 web开发: web, ...

  3. checkbox 样式重写

    css样式 .me-checkbox:checked { background: #1673ff } .me-checkbox { outline: none;/*轮廓*/ width: 25px; ...

  4. CSS中before、after伪类选择器的巧用

    大家好,今天给大家带来使用css中 before . after 实现两个效果,话不多说,我们先来看看, before 和 after 它们的作用是什么 选择器 作用 before 向选定的元素前插入 ...

  5. (办公)记事本_linux关机和重启命令

    参考谷粒学院的linux视频教程:http://www.gulixueyuan.com/course/300/task/7091/show .sync Linux sync命令用于数据同步,sync命 ...

  6. 服务器CentOS7上安装MySql

    1.确保服务器系统处于最新状态 [root@localhost ~]# yum -y update如果显示以下内容说明已经更新完成Replaced:grub2.x86_64 1:2.02-0.64.e ...

  7. 一维数组、二维数组——Java

    一. 一维数组 1.  数组是相同类型数据的有序集合 相同类型的若干个数据,按照一定先后次序排列组合而成 每个数组元素可以通过一个下标来访问它们 其中,每一个数据称作一个数组元素 2. 数组特点: 其 ...

  8. 请写一个java类,在任何时候都可以向它查询“你已经创建了多少个对象?”

    这个问题解决方法很简单,只要设置一个类的静态整型成员(事例中我设置的是n),初始化值为1,然后在其构造函数中添加语句使其+1(n++),这样需要查询创建了多少个对象时直接查询n的值就可以了,如下: p ...

  9. Java中WEAK_PASSWORD_HASH的修改策略

    在采用SHA-256对数据进行加密时,我们可以直接采用下面的方式进行处理: public static String encodeBySha256(String content) { String e ...

  10. Google Chrome 退出清除浏览数据

    版本 79.0.3945.88(正式版本) (64 位) 设置-高级-隐私设置和安全性-网站设置-Cookie和网站数据-退出Chrome时清除Cookie及网站数据.