本文通过
Python3+
pyqt5实现了
python Qt GUI 快速
编程的19章的页面索引器应用程序例子。
/home/yrd/eric_workspace/chap19/walker_ans.py
#!/usr/bin/env
python3
import codecs
import html.entities
import re
import sys
from
PyQt5.QtCore import (QMutex, QThread,
pyqtSignal,Qt)
class Walker(QThread):
finished =
pyqtSignal(bool,int)
目前任务需要做一个界面程序,PyQt是非常方便的选择,QT丰富的控件以及python方便的编程。近期遇到界面中执行一些后台任务时界面卡死的情况,解决了在这里记录下。
PyQt简介
PyQt是Qt的python接口,PyQt的文档较少,但接口和函数可以完全参照Qt,继承了Qt中大量的控件以及信号机制,十分方便。以下简介一个基本的PyQt程序。
– 需要导入的类主要来自三个包
– from PyQt5.QtWidgets import 常用的控件
– PyQt5.QtCore 核心功能类,如QT,QThread,pyqtSignal
– PyQt5.QtGui UI类,如QFont
这是因为对于pyqt来说,界面线程是主线程,如果我们再主线程函数里面代用了一个耗时比较久的循环,可能就会造成主界面线程卡死在循环中,从而造成无法操作主界面或者主界面卡顿、卡死。
所以这种情况下必须使用多线程的方式来解决,即在主界面线程中在启动一个新的子线程,利用
信号(Signal)与槽(Slot)是Qt中的核心机制,也是PyQt5编程中对象之间进行通信的机制。信号与槽具有以下特点:
1. 一个信号可以连接多个槽
2. 一个信号可以连接另一个信号
3. 信号参数可以使Python的任何类型
4. 一个槽可以监听多个信号
5. 信号与槽的连接方式可以是同步的,也可以是异步的
6. 信号与槽的连接可能会跨线程
7. 信号可能会断开
接着我们分析下面的代码:
from PyQt5.QtCore import *
class MyTypeSignal(QObject):
# 定义一个信号
sendmsg = pyqtSignal(object)
一、应用场景
在编写GUI界面中,通常用会有一些按钮,点击后触发事件,比如去下载一个文件或者做一些操作,这些操作会耗时,如果不能及时结束,主线程将会阻塞,这样界面就会出现未响应的状态,因此必须使用
多线程来解决这个问题。
二、使用
多线程
解决卡顿和假死
1.两个按钮,分别在控制台打印不同的内容,分别点击两个按钮后,控制台会依次打印内容,多次点击按钮,程序会先循环完上
b.使用