吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7042|回复: 19
收起左侧

[Python 转载] PySide6 入门教程

[复制链接]
beavailable 发表于 2022-1-3 16:09
本帖最后由 beavailable 于 2022-1-3 16:15 编辑

最近在学PySide6,写个 demo 记录一下。此 demo 是用来获取网页 html 源码的,也算是个入门教程吧。  

注:本教程基于Linux环境,Windows用户请自行替换一下相关的命令。

搭建环境

创建一个文件夹pyside6-demo并激活venv虚拟环境。

mkdir pyside6-demo
cd pyside6-demo
pythoon -m venv env
. env/bin/activate

安装依赖

安装pyside6httpx两个依赖项,后者是用来发送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类首先定义两个信号completedfailed,分别表示请求成功和失败两种情况。
再写一个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

来张截图: screenshot_20220103160457.png

完整源码

https://github.com/beavailable/pyside6-demo

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

青衫桑 发表于 2023-3-11 17:08
不是有个工具可以可视化设计窗口?希望可以讲讲
piazini 发表于 2023-2-18 23:30
beavailable 发表于 2023-2-9 10:00
请贴出完整的 output

C:\Users\Abb66>pip3 install pyside6
Looking in indexes: http://pypi.douban.com/simple, https://mirrors.163.com/pypi/simple/, https://pypi.tuna.tsinghua.edu.
cn/simple, https://pypi.mirrors.ustc.edu.cn/simple/, https://mirrors.aliyun.com/pypi/simple/, https://repo.huaweicloud.c
om/repository/pypi/simple, https://pypi.org/simple
ERROR: Could not find a version that satisfies the requirement pyside6 (from versions: none)
ERROR: No matching distribution found for pyside6
hiodis 发表于 2022-1-3 22:00
huyifan311 发表于 2022-1-3 22:34
感谢楼主为小白的分享
a5228172 发表于 2022-1-4 09:10
PySide6 有中文文档吗
 楼主| beavailable 发表于 2022-1-4 09:32
a5228172 发表于 2022-1-4 09:10
PySide6 有中文文档吗

应该没有吧。
lbbas 发表于 2022-1-4 10:29
[Python] 纯文本查看 复制代码
    
@Slot(httpx.Response)
    def showMessage(self, resp):
        self.output.setPlainText(resp.text)


这个里面的 httpx.Response是传参给resp了嘛?
 楼主| beavailable 发表于 2022-1-4 10:31
lbbas 发表于 2022-1-4 10:29
[mw_shl_code=python,true]   
@Slot(httpx.Response)
    def showMessage(self, resp):

@Slot(httpx.Response) 只是对槽函数的声明,表示此函数接收一个 httpx.Response 类型的参数,实际的函数中 resp 就是此类型的对象。

免费评分

参与人数 1热心值 +1 收起 理由
lbbas + 1 谢谢@Thanks!

查看全部评分

so_so_so 发表于 2022-5-10 17:33
学习了。也在找pyside6中文文档。
Hangjau 发表于 2022-5-14 20:13
so_so_so 发表于 2022-5-10 17:33
学习了。也在找pyside6中文文档。

我也在找  但是感觉很少
wjl 发表于 2022-5-27 18:46
@Slot()
@Slot(httpx.Response)
@Slot(object)

这三行有什么作用呀?没有这三行也不影响程序功能吧
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-28 08:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表