Python技术迷

PyQt6,用 Python 开发高级 GUI

说实话,第一次接触 PyQt 的时候,我脑子里闪过的是“这玩意儿会不会又是个半成品?”,因为 Python 做 GUI 向来名声一般。但真玩了一圈 PyQt6 之后,发现它不只是能画几个按钮窗口,完全可以做出媲美原生桌面的高级应用。关键还省掉了 C++ 那堆让人头大的编译和指针管理。

为什么是 PyQt6?

Python 本身在 Web、数据分析、AI 领域算是“神兵利器”,但做 GUI 一直是短板。Tkinter 太丑,wxPython 太冷门,Kivy 又像是给移动端准备的。PyQt6 背靠 Qt6,生态完整,文档多,跨平台(Windows、Linux、macOS)没问题,能写出既美观又实用的桌面程序。

换句话说,你想要一个同时能跑在 Win10、Ubuntu 和 macOS 上的桌面工具,PyQt6 是真能落地的方案。

从一个最小窗口开始

PyQt6 的窗口起手式很简单,一段代码就能跑出来个空白窗口:

import sys
from PyQt6.QtWidgets import QApplication, QWidget

app = QApplication(sys.argv)

window = QWidget()
window.setWindowTitle("PyQt6 Demo")
window.resize(400, 300)
window.show()

sys.exit(app.exec())

这几行就是 PyQt6 的 Hello World:创建一个 QApplication(事件循环)、建一个 QWidget(窗口)、show 出来。熟悉后你会发现它的套路和写前端差不多,组件拼来拼去。

控件和布局:比你想象的灵活

随便举个例子,比如我们做个“笔记小工具”,就要有输入框、按钮、文本显示区。PyQt6 的控件很丰富,按钮(QPushButton)、输入框(QLineEdit)、文本框(QTextEdit)、下拉框(QComboBox)这些全都有。布局用 QVBoxLayout、QHBoxLayout,像搭积木一样往里加。

from PyQt6.QtWidgets import QVBoxLayout, QPushButton, QTextEdit, QLineEdit

layout = QVBoxLayout()

input_box = QLineEdit()
save_btn = QPushButton("保存")
text_area = QTextEdit()

layout.addWidget(input_box)
layout.addWidget(save_btn)
layout.addWidget(text_area)

window.setLayout(layout)

跑起来就是一个竖着排的输入框 + 按钮 + 文本框界面。逻辑可以用信号和槽(signal & slot)来绑定,比如点击按钮保存输入内容:

defsave_text():
    text_area.append(input_box.text())
    input_box.clear()

save_btn.clicked.connect(save_text)

这一点 PyQt6 做得特别优雅,比 Tkinter 那种 callback 要顺手很多。

高级玩法:多线程和异步任务

写 GUI 最怕的是什么?卡顿。你一旦在主线程里跑耗时逻辑,窗口直接卡死(“未响应”警告你懂的)。PyQt6 里有 QThread 和 QRunnable 可以跑后台任务,把长时间的工作丢过去。

比如下载文件的进度条:

from PyQt6.QtCore import QThread, pyqtSignal
import time

classWorker(QThread):
    progress = pyqtSignal(int)

defrun(self):
for i in range(1, 101):
            time.sleep(0.05)
            self.progress.emit(i)

在 UI 里接收这个 progress 信号,就能实时更新进度条。这样用户就不会盯着死掉的窗口怀疑人生。

样式美化:不输前端

Qt 的样式表(QSS)和 CSS 十分类似,可以让 PyQt6 应用看起来完全不像“Python 写的”。比如:

window.setStyleSheet("""
    QPushButton {
        background-color: #3498db;
        color: white;
        border-radius: 5px;
        padding: 6px 12px;
    }
    QPushButton:hover {
        background-color: #2980b9;
    }
"""
)

配合一些开源的 QSS 主题,你能直接做出媲美 VSCode 界面的桌面应用。

和 Python 生态结合

PyQt6 的另一大杀手锏是能无缝用 Python 的库。比如你要画图,可以嵌入 Matplotlib;要用数据库,直接连 SQLite 或 Postgres;要调用接口,requests 一样能用。PyQt6 本质上只是提供了 UI 外壳,业务逻辑全走 Python,你写起来就很顺手。

打包与发布

最后一个常见问题:写好之后怎么交付?常见方式是用 PyInstaller 打包成可执行文件(.exe / .app),用户点开就是标准桌面应用。唯一要注意的是 Qt 库比较大,打包出来几十 MB 跑不了。但相对来说,换来的是跨平台和强大的 GUI 能力,还是值的。

总结一下,PyQt6 能力挺全,适合做:

  • 跨平台桌面小工具(笔记本、下载器、翻译器)
  • 企业内部运维工具(批量执行脚本、数据库查询)
  • 带图形交互的实验/科研工具

我自己踩过的坑主要是:别在主线程跑耗时逻辑,一定要用 QThread;还有就是 UI 样式最好早点规范,不然后面改起来很痛苦。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领