解决python tkinter界面卡死的问题


Posted in Python onJuly 17, 2019

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

import tkinter as tk
import time
 
def 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()

解决python tkinter界面卡死的问题

解决办法:

方式一、直接开线程

import tkinter as tk
import time
import threading
 
 
songs = ['爱情买卖','朋友','回家过年','好日子']
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 tk
import time
import threading
 
 
songs = ['爱情买卖','朋友','回家过年','好日子']
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 = func
    self.args = args
    
    self.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 tk
import time
import threading
 
songs = ['爱情买卖','朋友','回家过年','好日子'] 
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)
 
  # 打包进线程(耗时的操作)
  @staticmethod
  def thread_it(func, *args):
    t = threading.Thread(target=func, args=args) 
    t.setDaemon(True)  # 守护--就算主界面关闭,线程也会留守后台运行(不对!)
    t.start()      # 启动
    # t.join()     # 阻塞--会卡死界面!
    
    
app = Application()
app.mainloop()

以上这篇解决python tkinter界面卡死的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现3行代码解简单的一元一次方程
Aug 18 Python
编写Python脚本使得web页面上的代码高亮显示
Apr 24 Python
Python字符串替换实例分析
May 11 Python
Python绘制3d螺旋曲线图实例代码
Dec 20 Python
idea创建springMVC框架和配置小文件的教程图解
Sep 18 Python
Python中使用双下划线防止类属性被覆盖问题
Jun 27 Python
django2.2 和 PyMySQL版本兼容问题
Feb 17 Python
Python函数默认参数常见问题及解决方案
Mar 26 Python
python 解决Fatal error in launcher:错误问题
May 21 Python
Python xpath表达式如何实现数据处理
Jun 13 Python
pytorch 查看cuda 版本方式
Jun 23 Python
Anaconda配置各版本Pytorch的实现
Aug 07 Python
Python 实现数据结构-堆栈和队列的操作方法
Jul 17 #Python
Python 实现数据结构-循环队列的操作方法
Jul 17 #Python
Python图像处理PIL各模块详细介绍(推荐)
Jul 17 #Python
python中dict使用方法详解
Jul 17 #Python
python中tkinter的应用:修改字体的实例讲解
Jul 17 #Python
python对矩阵进行转置的2种处理方法
Jul 17 #Python
使用Filter过滤python中的日志输出的实现方法
Jul 17 #Python
You might like
十天学会php之第四天
2006/10/09 PHP
php xml实例 留言本
2009/03/20 PHP
php中利用post传递字符串重定向的实现代码
2011/04/21 PHP
DEDECMS首页调用图片集里的多张图片
2015/06/05 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
2016/05/28 Javascript
RequireJS多页面应用实例分析
2016/06/29 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
angular4模块中给标签添加背景图的实现方法
2017/09/15 Javascript
详解es6超好用的语法糖Decorator
2018/08/01 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
2019/06/20 Javascript
python解析html开发库pyquery使用方法
2014/02/07 Python
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
django的settings中设置中文支持的实现
2019/04/28 Python
Python变量访问权限控制详解
2019/06/29 Python
django中上传图片分页三级联动效果的实现代码
2019/08/30 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
为什么python比较流行
2020/06/19 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
公证书样本
2014/04/10 职场文书
乡镇遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
付款证明模板
2015/06/19 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL
教你如何使用Python开发一个钉钉群应答机器人
2021/06/21 Python
36个正则表达式(开发效率提高80%)
2021/11/17 Javascript
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby