解决python tkinter界面卡死的问题

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

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

以上这篇解决python tkinter界面卡死的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python实现定时自动关闭的tkinter窗口方法

    功能简要说明:程序运行后10秒钟自动关闭. 技术要点:tkinter应用程序的destroy()方法,多线程编程. 代码截图: 运行效果: 以上这篇Python实现定时自动关闭的tkinter窗口方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • 浅谈python3.6的tkinter运行问题

    python3.6在运行tkinter时要选择 run as Python unit-test, 否则报错 ModuleNotFoundError: No module named 'tkinter.ttk'; 'tkinter' is not a package 稍微提醒一下各位,仅此而已. 以上这篇浅谈python3.6的tkinter运行问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • python tkinter实现界面切换的示例代码

    跳转实现思路 主程序相当于桌子: import tkinter as tk root = tk.Tk() 而不同的Frame相当于不同的桌布: face1 = tk.Frame(root) face2 = tk.Frame(root) ... 每个界面采用类的方式定义各自的控件和函数,每个界面都建立在一个各自定义的Frame上,那么在实现跳转界面的效果时, 只需要调用tkinter.destroy()方法销毁旧界面,同时生成新界面的对象,即可实现切换. 而对于切换的过程中改变背景颜色和大小,可以

  • Python升级提示Tkinter模块找不到的解决方法

    一.安装tkinter 在Linux中python默认是不安装Tkinter模块, 复制代码 代码如下: [root@li250-193 ~]# python Python 2.6.6 (r266:84292, Feb 22 2013, 00:00:18) [GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2 Type "help", "copyright", "credits" or "li

  • 解决python tkinter界面卡死的问题

    如果点击按钮,运行了一个比较耗时的操作,那么界面会卡死. 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))

  • 解决Python图形界面中设置尺寸的问题

    Python有自己内置的标准GUI库--Tkinter,只要安装好Python就可以调用. 今天学习到了图形界面设计的问题,刚开始就卡住了.为啥呢?就是用geometry(size)设置窗口尺寸大小,如800X600,"X"从哪里来成了问题. 首先想到,这是个乘号,但是在程序中没有插入特殊符号这一说啊.所以,插入特殊符号的方法肯定不行了. 然后我心血来潮,从word的公式里复制了一个乘号过来(我也是服了我自己了),运行程序,可想而知,报错没商量. 看来求助外面是没用了.必须在Pytho

  • python tkinter界面居中显示的方法

    由于tkinter没有直接提供居中显示的api,因此,要想将tk的对话框居中显示,需要用到tk自带的设定位置的方法geometry() nScreenWid, nScreenHei = tkLogin.maxsize() nCurWid = tkLogin.winfo_reqwidth() nCurHeight = tkLogin.winfo_reqheight() tkLogin.geometry("{}x{}+{}+{}".format(nCurWid, nCurHeight, n

  • 在python tkinter界面中添加按钮的实例

    tkinter是python自带的GUI库,可以实现简单的GUI交互,该例子添加了五种不同效果的Button,如图: from tkinter import * from tkinter import messagebox #python3.0的messagebox,属于tkinter的一个组件 top = Tk() top.title("button test") def callback(): messagebox.showinfo("Python command&quo

  • Python tkinter界面实现历史天气查询的示例代码

    一.实现效果 1. python代码 import requests from lxml import etree import re import tkinter as tk from PIL import Image, ImageTk from xpinyin import Pinyin def get_image(file_nam, width, height): im = Image.open(file_nam).resize((width, height)) return ImageT

  • Python Pyqt5多线程更新UI代码实例(防止界面卡死)

    """ 在编写GUI界面中,通常用会有一些按钮,点击后触发事件, 比如去下载一个文件或者做一些操作, 这些操作会耗时,如果不能及时结束,主线程将会阻塞, 这样界面就会出现未响应的状态,因此必须使用多线程来解决这个问题. """ 代码实例 from PyQt5.Qt import (QApplication, QWidget, QPushButton,QThread,QMutex,pyqtSignal) import sys import time

  • python+tkinter+mysql做简单数据库查询界面

    目录 一.准备工作: 二.代码: 三.界面 四.总结 一.准备工作: 1.安装mysql3.7,创建一个test数据库,创建student表,创建列:(列名看代码),创建几条数据 (以上工作直接用navicat for mysql工具完成) 二.代码: import sys import tkinter as tk import mysql.connector as sql #--------------------查询函数--------------------------- def sql_

  • python Spyder界面无法打开的解决方法

    Spyder本来还用得好好的,能正常使用,后来再关闭打开时,出现下面的蜘蛛网界面后,就无法显示操作界面了: 后来在网上搜索了多种方法,甚至还将Adaconda2重装了都没有用. 后来找到一个方法,说删除C:\Users\Administrator路径下的.spyder文件夹(你的有可能是.spyder2或.spyder3),再重启spyder即可. 不过我尝试了一下,没什么用,后来结合了之前的搜索方法,将.matplotlib和.spyder一起删掉再重启,就能正常显示了. 以上这篇python

  • Python Tkinter 简单登录界面的实现

    如下所示: from tkinter import * class Reg (Frame): def __init__(self,master): frame = Frame(master) frame.pack() self.lab1 = Label(frame,text = "账户:") self.lab1.grid(row = 0,column = 0,sticky = W) self.ent1 = Entry(frame) self.ent1.grid(row = 0,colu

随机推荐