解决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 相关文章推荐
简单解析Django框架中的表单验证
Jul 17 Python
linux环境下的python安装过程图解(含setuptools)
Nov 22 Python
Python语言描述连续子数组的最大和
Jan 04 Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 Python
python运行时强制刷新缓冲区的方法
Jan 14 Python
python中实现控制小数点位数的方法
Jan 24 Python
python仿evething的文件搜索器实例代码
May 13 Python
详解Python用三种方式统计词频的方法
Jul 29 Python
Python GUI学习之登录系统界面篇
Aug 21 Python
python语言time库和datetime库基本使用详解
Dec 25 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 Python
Python OpenCV超详细讲解读取图像视频和网络摄像头
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
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
Phpbean路由转发的php代码
2008/01/10 PHP
UCenter Home二次开发指南
2009/05/28 PHP
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
php实现的click captcha点击验证码类实例
2014/09/23 PHP
JavaScript延迟加载
2021/03/09 Javascript
自适应高度框架 ----属个人收藏内容
2007/01/22 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
单击浏览器右上角的X关闭窗口弹出提示的小例子
2013/06/12 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
2017/11/22 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
2018/08/07 Javascript
详解Vue源码之数据的代理访问
2018/12/11 Javascript
vue父组件触发事件改变子组件的值的方法实例详解
2019/05/07 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
[59:53]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第二场 3月6日
2021/03/11 DOTA
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
Python命令行解析模块详解
2018/02/01 Python
浅析PyTorch中nn.Linear的使用
2019/08/18 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
2020/03/10 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
2020/05/25 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
css3实现可滑动跳转的分页插件示例
2014/05/08 HTML / CSS
利用CSS3实现平移动画效果示例代码
2016/10/12 HTML / CSS
FitFlop美国官网:英国符合人体工学的鞋类品牌
2018/10/05 全球购物
财务会计专业毕业生自荐信
2013/10/02 职场文书
基层干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
一年级数学上册复习计划
2015/01/17 职场文书
天河观后感
2015/06/11 职场文书
学历证明范文
2015/06/16 职场文书
pandas提升计算效率的一些方法汇总
2021/05/30 Python
python实现学员管理系统(面向对象版)
2022/06/05 Python