解决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使用urllib2模块抓取HTML页面资源的实例分享
May 03 Python
Python中使用插入排序算法的简单分析与代码示例
May 04 Python
python executemany的使用及注意事项
Mar 13 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
Jan 04 Python
python 二维数组90度旋转的方法
Jan 28 Python
基于Django静态资源部署404的解决方法
Jul 28 Python
python twilio模块实现发送手机短信功能
Aug 02 Python
Python+AutoIt实现界面工具开发过程详解
Aug 07 Python
numpy创建单位矩阵和对角矩阵的实例
Nov 29 Python
Pytorch释放显存占用方式
Jan 13 Python
浅谈Python3实现两个矩形的交并比(IoU)
Jan 18 Python
Python任务调度利器之APScheduler详解
Apr 02 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
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
php高级编程-函数-郑阿奇
2011/07/04 PHP
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
php无限遍历目录示例
2014/02/21 PHP
PHP实现取得HTTP请求的原文
2014/08/18 PHP
在Debian系统下配置LNMP的教程
2015/07/09 PHP
js中将多个语句写成一个语句的两种方法小结
2007/12/08 Javascript
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
关于图片按比例自适应缩放的js代码
2011/10/30 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
javascript实现Email邮件显示与删除功能
2015/11/21 Javascript
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
2015/12/10 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
JS for...in 遍历语句用法实例分析
2016/08/24 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
2016/09/08 Javascript
鼠标经过出现气泡框的简单实例
2017/03/17 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
Python之pymysql的使用小结
2019/07/01 Python
简单了解python filter、map、reduce的区别
2020/01/14 Python
Ajax和javascript的区别
2013/07/20 面试题
医学生自荐信范文
2013/12/03 职场文书
大学自我鉴定
2013/12/20 职场文书
军校本科大学生自我评价
2014/01/14 职场文书
我爱幼儿园演讲稿
2014/09/11 职场文书
学习优秀党务工作者先进事迹材料思想报告
2014/09/17 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
同学聚会通知书
2015/04/20 职场文书
离婚答辩状怎么写
2015/05/22 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏