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

三、或者,搞一个界面类:

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

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

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

     使用Maven+SpringMVC+Eclipse软件安装配置过程中的问题: 1.Eclipse总是卡死的解决办法: 一:内存不足所以会卡死,配置一下eclipse.ini修改这几个值就好了-X ...

  2. 运行RF测试案例,显示unable to open socket to "localhost:56505" error: [Errno 10061] 错误,且关闭RF卡死的解决办法

    问题描述: 执行WEB ui测试案例后,执行请他的测试案例显示unable to open socket to "localhost:56505" error: [Errno 10 ...

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

    将Dialog的modal属性设置为true,可以解决卡死的问题(但会给用户使用体验带来影响) var par = { title: This.title, width: This.width, he ...

  4. Windows10开机pin界面循环重启解决办法

    昨天电脑在开机时,进入pin界面,输入pin码之后系统没反应,也不显示登陆成功,大概一分钟之后自动重启,遂百度答案:大部分建议都是在开机显示win图标时强制关机,强制关机两次即自动进入疑难解答页面,以 ...

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

    Android stuido作为google主推的IDE,配合gradle编译,有很多的优点和便捷性.唯一使用过程中不舒服的地方就是莫名其妙的卡顿,经常在Gradle Build的时候卡死强制重启电脑 ...

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

    [复制来于网上]原文地址:http://www.sjyhome.com/dedecms-6.html 改过一次第二次忘记怎么改,还是转一下,下次忘记了翻翻文章就可以知道了.好记忆不如烂笔头 一.原因分 ...

  7. 【问题解决:启动卡死】Eclipse启动卡死的解决办法

    问题描述 Eclipse启动后卡死 问题分析 由于上一次没有正确关闭,导致在启动的时候开始 问题解决 方法1(推荐): 到<workspace>\.metadata\.plugins\or ...

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

    目前开发的程序在切换View时界面卡顿现象比较严重,影响用户体验,当前项目共就四个View,每个View也只是按钮,所以可以同时加载,不让其它view销毁. 只需在Adapter中重载destroyI ...

  9. SQLyog无操作一段时间后重新操作会卡死问题(解决办法)

    这种是因为一段时间不操作后,服务器将空闲连接丢弃了,而客户端(sqlyog)不知道,导致长时间无响应,而超时之后,sqlyog 使用了新的连接,所以又可以顺畅操作了. 将会话空闲时间默认改为自定义,填 ...

随机推荐

  1. UVa 12661 - Funny Car Racing(Dijkstra)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. 使用plugins让打包更便捷

    之前运行dist下的js,都是手动把index.html拷贝过去的,每次把dist文件夹删除,都需要将index.html拷贝进去,这样很麻烦,我们在webpack官方插件中找到HtmlWebpack ...

  3. 随手练——HDU 1251 统计难题

    知识点:前缀树.典型的前缀树模板. 这是用next[26]数组的版本,超内存了.(后来发现,用C++交不会超,G++就会超) #include <iostream> #include &l ...

  4. Git创建本地分支并关联远程分支

    创建本地分支git branch 分支名 例如:git branch dev,这条命令是基于当前分支创建的本地分支,假设当前分支是master(远程分支),则是基于master分支创建的本地分支dev ...

  5. pytest setup和teardown初始化

    用法简介: setup_method:仅作用于class用例集中的用例,置于class内,每个用例都会调用一次 setup_function:作用于独立的def用例,不可作用于class内的用例 se ...

  6. Dubbo实践(一)入门示例

    dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候 ...

  7. Python 有用的 map() deduce() filter() 函数

    #!/usr/bin/python#5!+4!+3!+2!+1! #give 3 return 3*2*1def jiechen(n): N = map(lambda x:x+1,range(n)) ...

  8. gem install redis安装时报错:redis requires Ruby version >= 2.2.2

    Centos默认支持ruby到2.0.0,可gem 安装redis需要最低是2.2.2 解决办法是 先安装rvm,再把ruby版本提升至2.3.3 1.安装curl sudo yum install  ...

  9. C++较精确的测试代码运行时间

    #include <chrono> using namespace chrono; int main() { auto t0 = system_clock::now(); //测试代码 a ...

  10. LVM的创建与管理

    LVM的创建与管理1.创建物理分区  fdisk 或者 parted 工具分区. LVM分区的类型ID为8e2.创建物理卷  pvcreate 磁盘分区或整个磁盘3.创建卷组  vgcreate 卷组 ...