程序的用户交互界面,英文称之为 UI (user interface)
当一个应用的 UI 比较复杂的时候,命令行方式就不便用户使用了,这时我们需要图形界面。
如果用 Python
语言开发 跨平台
的图形界面的程序,主要有3种选择:
Tkinter
wxPython
PySide2/PySide6、PyQt5/PyQt6
如果要开发小工具,界面比较简单,可以采用Tkinter。
如果是发布功能比较多的正式产品,采用基于Qt的 PySide2/PySide6、PyQt5/PyQt6。
PySide2/PySide6、PyQt5/PyQt6 都是基于著名的 Qt 库。
Qt库里面有非常强大的图形界面开发库,但是Qt库是C++语言开发的,PySide2、PyQt5可以让我们通过Python语言使用Qt。
但是 PySide、PyQt 这两者有什么区别呢?
可以形象地这样说: PySide 是Qt的 亲儿子
, PyQt 是Qt还没有亲儿子之前的收的 义子
(Riverbank Computing这个公司开发的)。
两个库的使用对程序员来说,差别很小:它们的调用接口几乎一模一样。
如果你的程序是PyQt5开发的,往往只要略作修改,比如把导入的名字从 PyQt5 换成 PySide2 就行了。反之亦然。
许可证方面也有区别:
pip install pyside2
pip install pyside6
安装 PySide2, 要求 Python版本 <= 3.10
安装 Pyside6, 要求 Python版本 >= 3.10
pip install pyqt5-tools
pip install pyqt6-tools
安装完上面的依赖后,我们需要在 IDE 中进行配置
首先我们安装完 pyside6 后,可以使用pip show pyside6
查看安装路径
安装 Qt for python
插件,安装完成后,打开插件的设置
配置如下的三项
pyside6-rcc作用是转换资源文件.qrc
为.py
,第一次接触可以先忽视。
路径在python 环境的 bin 目录下
pyside6-uic作用是将QT designer设计出来的.ui
文件,转换为.py
文件。
路径和上面的 rcc 在同级目录中。
QT designer是图形化界面设计UI的。
执行pip show pyside6
,进入Location/PySide6
,里面有个Designer.exe
(Windows)Designer.app
(Mac)
Windows 直接配置这个Designer.exe
的路径就可以。
Mac 需要配置Designer.app/Contents/MacOS/Designer
的路径。
在Settings - Tools - External Tools
中分别添加三个工具
$FilePath$
$ProjectFileDir$
$FilePath$ -o $FileDir$/$FileNameWithoutExtension$_rc.py
$ProjectFileDir$
$FilePath$ -o $FileDir$/$FileNameWithoutExtension$_ui.py
$ProjectFileDir$
有的时候我们希望当我们编辑.ui
文件的时候,自动实时生成.py
文件,那么就可以利用 PyCharm 的File Watchers
功能
打开Settings - Tools - File Watchers
中,新增一个QT Ui File Auto Conver
的 Watcher即可。
from PySide6.QtWidgets import QApplication,QMainWindow,QLabel
application = QApplication([])
main_window = QMainWindow()
main_window.resize(500,400)
main_window.move(300,300)
label = QLabel(parent=main_window,text='Hello World!')
label.move(10,10)
main_window.show()
application.exec()
QApplication
提供了整个图形界面程序的底层管理功能,比如:
初始化、程序入口参数的处理,用户事件(对界面的点击、输入、拖拽)分发给各个对应的控件,等等。
既然QApplication要做如此重要的初始化操作,所以,我们必须在任何界面控件对象创建前,先创建它。
对于上面的代码,我们可以按照规范编码的形式进行编写,即每一个自定义窗口为一个类
from PySide6.QtWidgets import QApplication, QMainWindow, QLabel
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.lable = QLabel(parent=self, text='Hello World!')
self.lable.move(10, 10)
application = QApplication([])
main_window = MainWindow()
main_window.resize(500,400)
main_window.move(300,300)
main_window.show()
application.exec()