解决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 时间处理datetime实例
Sep 06 Python
linux系统使用python监控apache服务器进程脚本分享
Jan 15 Python
Python随机生成彩票号码的方法
Mar 05 Python
python实现红包裂变算法
Feb 16 Python
Python Requests安装与简单运用
Apr 07 Python
Win10下Python环境搭建与配置教程
Nov 18 Python
Python去除、替换字符串空格的处理方法
Apr 01 Python
dataframe设置两个条件取值的实例
Apr 12 Python
Python中分支语句与循环语句实例详解
Sep 13 Python
python tkinter之顶层菜单、弹出菜单实例
Mar 04 Python
基于Django集成CAS实现流程详解
Nov 28 Python
python3 kubernetes api的使用示例
Jan 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
PHP入门速成(2)
2006/10/09 PHP
destoon官方标签大全
2014/06/20 PHP
PHP中mysqli_affected_rows作用行数返回值分析
2014/12/26 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
php中10个不同等级压缩优化图片操作示例
2016/11/14 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
javascript 拖动表格行实现代码
2011/05/05 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
jQuery中ajax的使用与缓存问题的解决方法
2013/12/19 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
自己动手写的jquery分页控件(非常简单实用)
2015/10/28 Javascript
jQuery表单对象属性过滤选择器实例详解
2016/09/13 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
2017/04/26 Javascript
简单实现js鼠标跟随效果
2020/08/02 Javascript
JS求Number类型数组中最大元素方法
2018/04/08 Javascript
jquery实现搜索框功能实例详解
2018/07/23 jQuery
vue router 源码概览案例分析
2018/10/09 Javascript
vue中实现上传文件给后台实例详解
2019/08/22 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
python win32 简单操作方法
2017/05/25 Python
Python编程使用NLTK进行自然语言处理详解
2017/11/16 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
django框架实现一次性上传多个文件功能示例【批量上传】
2019/06/19 Python
Python: 传递列表副本方式
2019/12/19 Python
基于python监控程序是否关闭
2020/01/14 Python
解决flask接口返回的内容中文乱码的问题
2020/04/03 Python
使用python创建Excel工作簿及工作表过程图解
2020/05/27 Python
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
销售提升方案
2014/06/07 职场文书
关心下一代工作先进事迹
2014/08/15 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书
现货白银电话营销话术
2015/05/29 职场文书
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis
Python如何用re模块实现简易tokenizer
2022/05/02 Python