解决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 运算符 供重载参考
Jun 11 Python
Python实现测试磁盘性能的方法
Mar 12 Python
Python基础教程之tcp socket编程详解及简单实例
Feb 23 Python
利用信号如何监控Django模型对象字段值的变化详解
Nov 27 Python
python实现批量解析邮件并下载附件
Jun 19 Python
django表单的Widgets使用详解
Jul 22 Python
浅谈django2.0 ForeignKey参数的变化
Aug 06 Python
使用Python的Turtle库绘制森林的实例
Dec 18 Python
Python操作MongoDb数据库流程详解
Mar 05 Python
python实现简单学生信息管理系统
Apr 09 Python
python如何求圆的面积
Jul 01 Python
基于Python实现对比Exce的工具
Apr 07 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
ThinkPHP之foreach标签使用概述
2014/06/30 PHP
thinkphp配置连接数据库技巧
2014/12/02 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
10个php函数实用却不常见
2015/10/13 PHP
iOS+PHP注册登录系统 PHP部分(上)
2016/12/26 PHP
PHP中Notice错误常见解决方法
2017/04/28 PHP
在Laravel 的 Blade 模版中实现定义变量
2019/10/14 PHP
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
javascript 事件处理示例分享
2014/12/31 Javascript
在JavaScript中使用JSON数据
2016/02/15 Javascript
js表单验证实例讲解
2016/03/31 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
jquery实现动态添加附件功能
2018/10/23 jQuery
Vue组件间数据传递的方式(3种)
2020/07/13 Javascript
解决echarts数据二次渲染不成功的问题
2020/07/20 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
go和python调用其它程序并得到程序输出
2014/02/10 Python
Python+微信接口实现运维报警
2016/08/27 Python
python 中的list和array的不同之处及转换问题
2018/03/13 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
在python中利用最小二乘拟合二次抛物线函数的方法
2018/12/29 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
python 输出列表元素实例(以空格/逗号为分隔符)
2019/12/25 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
在python中对于bool布尔值的取反操作
2020/12/11 Python
css3+jq创作含苞待放的荷花
2014/02/20 HTML / CSS
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
化石印度尼西亚在线商店:Fossil Indonesia
2019/03/11 全球购物
应届生法律求职信
2013/10/22 职场文书
医院我们的节日活动实施方案
2014/08/22 职场文书
四风问题对照检查材料
2014/09/22 职场文书
2015年上半年计生工作总结
2015/03/30 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
MySQL 使用SQL语句修改表名的实现
2021/04/07 MySQL