解决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之集合(set)
Sep 24 Python
Python实现提取文章摘要的方法
Apr 21 Python
合并百度影音的离线数据( with python 2.3)
Aug 04 Python
Linux中Python 环境软件包安装步骤
Mar 31 Python
Python实现读取txt文件并画三维图简单代码示例
Dec 09 Python
python实现二叉树的遍历
Dec 11 Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 Python
python  Django中的apps.py的目的是什么
Oct 15 Python
使用python进行拆分大文件的方法
Dec 10 Python
python常用数据重复项处理方法
Nov 22 Python
python如何快速拼接字符串
Oct 28 Python
Django contrib auth authenticate函数源码解析
Nov 12 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
单位速度在实战中的运用
2020/03/04 星际争霸
smarty获得当前url的方法分享
2014/02/14 PHP
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
php图片的二进制转换实现方法
2014/12/15 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
引用其它js时如何同时处理多个window.onload事件
2014/09/02 Javascript
js中confirm实现执行操作前弹出确认框的方法
2014/11/01 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
JavaScript实现控制打开文件另存为对话框的方法
2015/04/17 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
javascript函数自动执行常用方法汇总
2016/03/28 Javascript
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
2020/02/15 Javascript
跟老齐学Python之玩转字符串(1)
2014/09/14 Python
解析Python中的二进制位运算符
2015/05/13 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
2019/07/11 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
2019/08/18 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
Python3基于print打印带颜色字符串
2020/07/06 Python
Python grpc超时机制代码示例
2020/09/14 Python
python+opencv实现车道线检测
2021/02/19 Python
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
研究生毕业鉴定
2014/01/29 职场文书
小学端午节活动方案
2014/03/13 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
员工安全生产责任书
2014/07/22 职场文书
爱祖国爱家乡演讲稿
2014/09/02 职场文书
红色故事汇观后感
2015/06/18 职场文书
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript