解决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操作SQLite简明教程
Jul 10 Python
python实现在每个独立进程中运行一个函数的方法
Apr 23 Python
总结网络IO模型与select模型的Python实例讲解
Jun 27 Python
使用Python脚本和ADB命令实现卸载App
Feb 10 Python
Python使用struct处理二进制的实例详解
Sep 11 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
Sep 30 Python
解决python os.mkdir创建目录失败的问题
Oct 16 Python
Python这样操作能存储100多万行的xlsx文件
Apr 16 Python
Django admin model 汉化显示文字的实现方法
Aug 12 Python
Python GUI自动化实现绕过验证码登录
Jan 10 Python
Python使用configparser库读取配置文件
Feb 22 Python
matplotlib实现数据实时刷新的示例代码
Jan 05 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 分库分表hash算法
2009/11/12 PHP
php将fileterms函数返回的结果变成可读的形式
2011/04/21 PHP
PHP url 加密解密函数代码
2011/08/26 PHP
PHP JSON格式的中文显示问题解决方法
2015/04/09 PHP
Linux环境下php实现给网站截图的方法
2016/05/03 PHP
微信自定义分享php代码分析
2016/11/24 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
2020/02/10 PHP
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
再谈JavaScript线程
2015/07/10 Javascript
js表单处理中单选、多选、选择框值的获取及表单的序列化
2016/03/08 Javascript
js注入 黑客之路必备!
2016/09/14 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
微信小程序多音频播放进度条问题
2018/08/28 Javascript
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
[11:57]《一刀刀一天》第十七期:TI中国军团加油!
2014/05/26 DOTA
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
Python迭代器和生成器介绍
2015/03/06 Python
python3实现SMTP发送邮件详细教程
2018/06/19 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
Java面试题:为什么要用Java
2012/05/11 面试题
演讲稿怎么写才完美
2014/01/02 职场文书
高一地理教学反思
2014/01/18 职场文书
运动会解说词200字
2014/02/06 职场文书
安全责任书范文
2014/03/12 职场文书
房产继承公证书
2014/04/09 职场文书
食品委托检验协议书范本
2014/09/12 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
力克胡哲观后感
2015/06/10 职场文书
2016年中秋节慰问信
2015/12/01 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis