解决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 获取进程pid号的方法
Mar 10 Python
Python读写ini文件的方法
May 28 Python
Python PyQt5实现的简易计算器功能示例
Aug 23 Python
matplotlib作图添加表格实例代码
Jan 23 Python
python保存文件方法小结
Jul 27 Python
Python多继承以及MRO顺序的使用
Nov 11 Python
django中url映射规则和服务端响应顺序的实现
Apr 02 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 Python
Python调用飞书发送消息的示例
Nov 10 Python
python神经网络编程之手写数字识别
May 08 Python
Python 线程池模块之多线程操作代码
May 20 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
Apr 11 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实现简单洗牌算法
2013/06/18 PHP
PHP缓存集成库phpFastCache用法
2014/12/15 PHP
PHP统一页面编码避免乱码问题
2015/04/09 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
js图片轮播手动切换效果
2015/11/10 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
解析Node.js基于模块和包的代码部署方式
2016/02/16 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
Angular4 组件通讯方法大全(推荐)
2018/07/12 Javascript
NestJs 静态目录配置详解
2019/03/12 Javascript
Vue父子传递实例讲解
2020/02/14 Javascript
Vue中实现回车键切换焦点的方法
2020/02/19 Javascript
[02:19]DOTA2上海特级锦标赛 观赛指南 Spectator Guide
2016/02/04 DOTA
python模拟登陆阿里妈妈生成商品推广链接
2014/04/03 Python
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
配置python的编程环境之Anaconda + VSCode的教程
2020/03/29 Python
解决python调用自己文件函数/执行函数找不到包问题
2020/06/01 Python
详细分析Python可变对象和不可变对象
2020/07/09 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
html5文本内容_动力节点Java学院整理
2017/07/11 HTML / CSS
豪华复古化妆:Besame Cosmetics
2019/09/06 全球购物
高三自我鉴定怎么写
2013/10/19 职场文书
保安员岗位职责
2013/11/17 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
维稳承诺书
2015/01/20 职场文书