tkinter界面卡死的解决办法

0、如果点击按钮,运行了一个比较耗时的操作,那么界面会卡死

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()

解决办法:

方式一、直接开线程

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()
时间: 2025-01-01 21:06:47

tkinter界面卡死的解决办法的相关文章

python安装markupsafe模块时卡死的解决办法

起因: 升级OS X从10.8到10.9,会发现在安装python的markupsafe模块时一直卡住. 当时的机器环境是: OSX 10.9, XCode 4.6.2, Python 2.7.6, Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn) 界面一直停留在下面的情况 mbp:MarkupSafe-0.23 $ python setup.py install running install running bdis

1.Maven+SpringMVC+Eclipse软件安装配置,Maven报插件错误,Eclipse总是卡死的解决办法,导入一个maven工程后 一直显示importing maven project

 使用Maven+SpringMVC+Eclipse软件安装配置过程中的问题: 1.Eclipse总是卡死的解决办法: 一:内存不足所以会卡死,配置一下eclipse.ini修改这几个值就好了-XX:MaxPermSize=768m-Xms1024m-Xmx3072m搜索 二:修改window->preferences --- > JAVA->Edittor->Hovers,将右侧所有复选框清空. 2.因为eclipse上一次未正常关闭,导致启动卡死,错误日志为: [plain

android viewpager fragment切换时界面卡顿解决办法

目前开发的程序在切换View时界面卡顿现象比较严重,影响用户体验,当前项目共就四个View,每个View也只是按钮,所以可以同时加载,不让其它view销毁. 只需在Adapter中重载destroyItem类即可 @Override public void destroyItem(ViewGroup container, int position, Object object) { //重载该方法,防止其它视图被销毁,防止加载视图卡顿 //super.destroyItem(container,

EasyUI, Dialog 在框架页(ifrmae)的Top页面弹出时,拖拽Dialog边缘(以改变窗口大小),UI界面被卡死的解决办法

将Dialog的modal属性设置为true,可以解决卡死的问题(但会给用户使用体验带来影响) 1 var par = { 2 title: This.title, 3 width: This.width, 4 height: This.height, 5 cache: This.cache, 6 modal: This.modal, 7 resizable: This.resizable, 8 maximizable: This.maximizable, 9 onResize: This.on

vue项目中使用elementUI的el-tabs组件 浏览器卡死问题 解决办法

公司的项目都是以前做的,所以不管是vue还是element-ui版本都过于老旧,尤其是element-ui基本都是在2.8.2以前的,因此很多新的功能就无法使用,于是就想到升级 element 但是升级完就会发现,只要页面中用到el-tab就会出现卡死状态 网上找了很多办法,原因都是相同的,vue跟element版本不匹配 于是升级vue 发现不行,还报错 原来还要升级 vue-template-compiler 总结如下: 升级  element 升级  vue 升级   vue-templa

VS2010 VS2012拖拽NumericUpDown控件直接卡死的解决办法

昨天晚上画界面过程中碰到这个问题,本以为是VS的bug,并没在意gg了一个2010的Sp1补丁,之后进入官方下载器,50mb/s的网,大概更新了3-4个小时.今天晚上到了画界面的时间准备开始就又碰到了这个问题,我就立刻的换了2012尝试,同样的结果,索性在群里问了问没人搭理我,故不断的google,终于找到一个说是是是是有道字典和vs冲突,关掉了有道,问题解决啦!解决方案就是关掉关关关关关关有道,如果你也碰到这个问题,希望对您有帮助吧

Android Studio 运行、编译卡死的解决办法

Android stuido作为google主推的IDE,配合gradle编译,有很多的优点和便捷性.唯一使用过程中不舒服的地方就是莫名其妙的卡顿,经常在Gradle Build的时候卡死强制重启电脑,非常无语,我的机器是8G内存新机器也没开其他程序.总之非常编译速度很慢有时还会经常卡死.尝试了很多优化方案,卡死次数少了编译也快了不少.将我的发现和大家分享一下.  加大运行内存和优化编译 以PC 端为例,MAC大同小异 1.申请大内存 installation path\studio64.exe

织梦CMS后台卡死的解决办法

一.原因分析 经常登录后台的站长可能会发现,当访问织梦后台首页的时候,它会检查网站是否有更新补丁.程序目录安全设置等.而很多服务器都禁用了对自身以外的网络访问,因此织梦在检查更新的时候,相当于是在服务器上访问自身之外的网络,并且织梦的程序并没有限制更新检查最大时间,导致浏览器一直处于等待状态.实际上这是织梦自身的疏忽,从技术的角度来讲,这完全可以解决掉. 二.解决方法 1.将网站后台(默认dede)目录下 templets/index_body.htm 中的以下代码删除掉. <script ty

C# Serialport执行close()方法时,程序卡死的解决办法

根据网上搜到的文章,程序中添加两个bool变量,作为状态标记,保证串口关闭时,串口事件已处理完 private volatile bool is_serial_listening = false;//串口正在监听标记private volatile bool is_serial_closing = false;//串口正在关闭标记 //Program Begins using System;using System.Collections.Generic;using System.Compone