最近在学PySide6
,写个 demo 记录一下。此 demo 是用来获取网页 html 源码的,也算是个入门教程吧。
注:本教程基于Linux
环境,Windows
用户请自行替换一下相关的命令。
搭建环境
创建一个文件夹pyside6-demo
并激活venv
虚拟环境。
mkdir pyside6-demo
cd pyside6-demo
pythoon -m venv env
. env/bin/activate
安装依赖
安装pyside6
和httpx
两个依赖项,后者是用来发送HTTP
请求的。
pip install pyside6 httpx
编写代码
我们需要两个类,一个MainWindow
类用来显示 UI,一个HtmlWorker
类用来发送HTTP
请求。
main.py
先把两个类的定义和程序入口写出来。
class HtmlWorker(QThread):
pass
class MainWindow(QMainWindow):
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec())
class MainWindow
首先在__init__()
函数中初始化 UI,这里完成的功能比较琐碎,就不细说了,主要就是初始化一个HtmlWorker
对象,创建一个输入框,一个按钮和一个用来显示源码的编辑框。
再定义一个槽函数fetchHtml()
用来响应按钮点击事件,这里主要做的工作就是启动线程,让HtmlWorker
对象去完成实际的工作。
最后定义两个槽函数showMessage()
和showError()
分别用来显示结果和错误。
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('PySide6 Demo')
rect = self.screen().geometry()
size = self.size()
self.setGeometry(QStyle.alignedRect(Qt.LayoutDirection.LeftToRight, Qt.AlignCenter, size, rect))
self.htmlWorker = HtmlWorker()
self.htmlWorker.completed.connect(self.showMessage)
self.htmlWorker.failed.connect(self.showError)
# ui
widget = QWidget()
self.setCentralWidget(widget)
layout = QVBoxLayout()
layout.addLayout(self.makeInputLayout())
layout.addWidget(self.makeOutputWidget())
widget.setLayout(layout)
def makeInputLayout(self):
self.edit = QLineEdit()
self.btn = QPushButton('&Show Html')
layout = QHBoxLayout()
layout.addWidget(self.edit)
layout.addWidget(self.btn)
self.edit.returnPressed.connect(self.btn.click)
self.btn.clicked.connect(self.fetchHtml)
return layout
def makeOutputWidget(self):
self.output = QTextEdit()
return self.output
@Slot()
def fetchHtml(self):
if self.htmlWorker.isRunning():
return
url = self.edit.text()
if not url:
return
self.output.clear()
if not url.startswith('http'):
url = 'https://' + url
self.htmlWorker.setUrl(url)
self.htmlWorker.start()
@Slot(httpx.Response)
def showMessage(self, resp):
self.output.setPlainText(resp.text)
@Slot(object)
def showError(self, err):
QMessageBox.warning(self, 'error', str(err))
class HtmlWorker
HtmlWorker
类首先定义两个信号completed
和failed
,分别表示请求成功和失败两种情况。
再写一个setUrl()
用来指定要请求的url
。
最后就是重写run()
方法,完成发送请求的功能。
class HtmlWorker(QThread):
completed = Signal(httpx.Response)
failed = Signal(object)
def setUrl(self, url):
self.url = url
def run(self):
try:
resp = httpx.get(self.url, follow_redirects=True)
except:
self.failed.emit(sys.exc_info()[1])
else:
self.completed.emit(resp)
运行
./main.py
来张截图:
完整源码
https://github.com/beavailable/pyside6-demo