python编写桌面小工具_Qt Designer极速开发python桌面小工具详解

在GUI程序中,主线程也叫GUI线程,因为它是唯一被允许执行GUI相关操作的线程。对于一些耗时的操作,如果放在主线程中,就是出现界面无法响应的问题。

在编写QT的界面程序时,当我们调用QApplication.exec()时,我们就启动了QT的事件循环。在开始的时候,QT会发出一些事件来显示和绘制窗口部件。在这之后,事件循环就开始运行,不断地检查是不是有事件发生并且把这些事件发送给应用程序中的QObject。

当一个事件被处理时,其他事件也可能会产生并且追加到QT的事件队列中。如果我们在处理一个特定的事件上耗费过多的时间,用户界面就会变得不能够响应。

2、解决思路

解决该问题的方法有很多,如使用QTimer不断应答的,这里我还是喜欢以线程的方式来处理。

如把类似按钮触发代码:

ui.pushButton.clicked.connect(partial(sitemapgo, ui))

改为:

thread = RunThread(ui) # 创建一个线程

ui.pushButton.clicked.connect(lambda: thread.start())

3、实现处理线程

1)首先加入QtCore包的引用

from PyQt5 import QtCore

from PyQt5.QtCore import *

2)把原来的sitemapgo函数处理逻辑填入run中进行简单的改造,具体怎么改造,相信有python基础的朋友来说都不难。如果没有python基础,建议学习下runoob.com中的基础教程。

具体线程类实现代码如下:

class RunThread(QThread):

# python3,pyqt5与之前的版本有些不一样

# 通过类成员对象定义信号对象

# _signal = pyqtSignal(str)

trigger = pyqtSignal()

def __init__(self, ui):

super(RunThread, self).__init__()

self.ui = ui

def __del__(self):

self.wait()

def run(self):

#线程处理逻辑

try:

…… #填入网站生成sitemap的逻辑

except:

print("出现异常错误!")

finally:

self.trigger.emit()

if __name__ == '__main__':

app = QApplication(sys.argv)

MainWindow = QMainWindow()

ui = sitedog.Ui_MainWindow()

ui.setupUi(MainWindow)

MainWindow.show()

thread = RunThread(ui) # 创建一个线程

ui.pushButton.clicked.connect(lambda: thread.start())

sys.exit(app.exec_())

4、最后再来运行工具,就再也不会出现“未响应”错误了。

六、实现控制台显示

我们发现程序的输出都是在控制台打印的,非常不方便,这是该怎么输出到前端textBrowser中呢?这里我们修改gui_file_name.py文件(gui_file_name是什么?一头雾水请再复习下前面)

1、首先引入sys

import sys

2、定义发送信号槽

class EmittingStr(QtCore.QObject):

textWritten = QtCore.pyqtSignal(str) #定义一个发送str的信号

def write(self, text):

self.textWritten.emit(str(text))

3、在类Ui_MainWindow中开始处添加

class Ui_MainWindow(object):

def __init__(self):

# 下面将输出重定向到textBrowser中

sys.stdout = EmittingStr(textWritten=self.outputWritten)

sys.stderr = EmittingStr(textWritten=self.outputWritten)

def outputWritten(self, text):

cursor = self.textBrowser.textCursor()

cursor.movePosition(QtGui.QTextCursor.End)

cursor.insertText(text)

self.textBrowser.setTextCursor(cursor)

self.textBrowser.ensureCursorVisible()

4、再来运行上面的sitemap生成工具,控制台没有再打印输出,都在textBrowser中显示了。

到了这一步,我们的PyQT5工具开发就基本告一段落了。怎么样,很简单吧?

参考文章:

https://blog.csdn.net/azuremouse/article/details/90338961

https://www.cnblogs.com/hhh5460/p/5175322.html

https://blog.csdn.net/weixin_38308549/article/details/105200032

http://www.45fan.com/article.php?aid=19062535244902109151948616

-- End --

文末寄语:  用自己的努力换取成功,然后成功就会像一个大巴掌,打在那些曾经看不起你的人脸上,要多响有多响,要多爽有多爽。

本文由51ste.com网友编辑,未经授权,不得转载使用上述作品盈利;个人转载,需标明作者及出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值