超全!Python图形界面框架PyQt5使用指南! % s' I& I, Q% A + ~7 {: G; A* o! d, H使用Python开发图形界面的软件其实并不多,相对于GUI界面,可能Web方式的应用更受人欢迎。但对于像我一样对其他编程语言比如C#或WPF并不熟悉的人来说,未必不是一个好的工具。 6 s) f5 b0 |3 \; ~9 Y O! P- O/ s7 Y- o/ {: [/ u' |$ ?常见GUI框架 2 K% a R) { \' s3 S; H. X + s" k7 ~) I6 Y9 v5 `6 GPyQt5:Qt是一个跨平台的 C++图形用户界面库。QT一度被诺基亚拥,后出售给芬兰的软件公司Digia Oyj。PyQt5是基于Digia公司Qt5的Python接口,由一组Python模块构成。PyQt5本身拥有超过620个类和6000函数及方法。在可以运行于多个平台,包括:Unix, Windows, and Mac OS。& E5 Q; U9 g: a0 C* _
f( I6 T, k% n( H: T5 A
Pyside6:Pyside是QT公司官方提供的Python包,上一版本为Pyside2,对应的是QT5,最新版命名规则进行了调整,更改为Pyside6,对应的是QT6版本。由于官方出品的比较看好,缺点是发布比较晚,网上的资料没有PyQt5多。 + j% B/ V% _, u: X& b( }8 j4 c5 I6 z! e
Tkinter:Python内置的GUI框架,使用TCL实现,Python中内嵌了TCL解释器,使用它的时候不用安装额外的扩展包,直接import,跨平台。不足之处在于UI布局全靠代码实现,只有15种常用部件,显示效果简陋。7 q& O3 i2 T! G% B( e7 k
; J& ]8 {% Q+ m
PySimpleGUI:PySimpleGUI 是 Tkinter 一层包装。使用 PySimpleGUI 实现自定义 GUI 所需的代码量要比使用 Tkinter 直接编写相同的 GUI 要少得多。 * A8 @1 Y4 H5 @0 ?& f4 [- y 3 z5 _/ H) q% H5 F! EWxPython:wxPython是Python语言对流行的wxWidgets跨平台GUI工具库的绑定。用得比较广泛,跨平台,C++编写,文档少,用户可能就需要根据编程内容对不同平台中的GUI代码做一些调整。遇到问题不好解决,代码布局控件,不直观。 * R" Z& \* v' m' Z4 f / Y3 M$ L& k& e7 }2 z6 DWax:基于wxPython ,为克服wxPython的问题而制作的一个包。1 }: }* J. q$ t
- a1 u* f4 n) A3 E z3 c" UKivy:主要针对多点触控程序,智能手机平板等,也可以在没有触屏功能的系统上,全平台支持(Windows, Linux, Mac OS X, Android and iOS.)使用Python和cython编写,中文支持差,需要自己下载中文库并且制定路径。! L8 P' T& `8 a4 v
; O" H* R9 X$ p* B
BeeWare:Write once. Deploy everywhere.需要与Kivy配合使用。, ?) k" r% m* j
9 L- \* E" Q, r( ]/ @% i. m' B
Toga:一个使用Python开发原生APP的GUI工具包。Toga由一个具有共享接口的基础组件库组成,以简化与平台无关的GUI开发。Toga适用于Mac OS、Windows、Linux(GTK)以及Android和iOS等移动平台。& m+ |/ {. F* l. d1 d' B
; I" S7 N3 f' n2 y/ D' K
Eel:一个轻量的 Python 库,用于制作简单的类似于 Electron(但是比它更轻量) 的离线 HTML/JS GUI 应用程序,并具有对 Python 功能(capabilities)和库的完全访问权限。# P% |# w: r' y1 ^* D$ A
1 Q) c& v% w. f. O. @9 g3 J( kFlexx:一个纯 Python 工具包,用来创建图形化界面应用程序。其使用 Web 技术进行界面的渲染。你可以用 Flexx 来创建桌面应用,同时也可以导出一个应用到独立的 HTML 文档。因为使用纯 Python 开发,所以 Flexx 是跨平台的。只需要有 Python 和浏览器就可以运行。$ n; l# c* _$ o8 C+ [
5 T% K4 \" s7 n( @pywebview是围绕 webview 组件的轻量型跨平台包装器(wrapper),它允许在其自己的本机 GUI 窗口中显示 HTML 内容。它使您可以在桌面应用程序中使用 Web 技术,同时尽最大可能隐藏使用浏览器构建GUI的事实。 + p; D' \7 W, | ; m; Y9 f& g8 ~, O2 eenaml:一种能够让你用最小的努力就可以实现高质量GUI界面的的Python框架,也是一种独特的编程语言。enaml将声明性语言与基于约束的布局系统结合在一起,使用户可以轻松地定义灵活布局的UI。enaml应用程序可以在任何支持Python和Qt的平台上运行。* R" k2 i$ k9 r' N
8 o3 I2 q# \* q$ \$ h8 Q
个人想法:太多学不完,先学PyQt5,原因是资料多,学有余力再学pyside6,最后看下PySimpleGUI,看能否解决一些简单问题。 5 F. T# }0 d# R6 [0 ~) d1 e5 m# f8 B5 C" g
PyQt5简介: Q& O) u2 x3 {8 K
* D! |: v9 _1 i' ?& T
PyQt是Qt框架的Python语言实现,由Riverbank Computing开发,是最强大的GUI库之一。PyQt提供了一个设计良好的窗口控件集合,每一个PyQt控件都对应一个Qt控件,因此PyQt的API接口与Qt的API接口很接近,但PyQt不再使用QMake系统和Q_OBJECT宏。- |7 W& n% V9 {) S C+ Q! s
: Z) P D8 S1 y/ n. z) W. s8 s$ XPyQt5提供GPL版和商业版证书,自由开发者可以使用免费的GPL许可,如果需要将PyQt用于商业应用,则必须购买商业许可。 ) `1 h5 n1 Q) q/ E1 G. t3 Q! H0 A+ \& i0 h( z0 c- u
PyQt5特性如下:" A3 t R% d( K% Z# U( Y
& i0 p. J/ L4 x基于高性能的Qt的GUI控件集。 : Q$ K( ^4 d# Q* O# G# x# K2 w. Q7 Z+ e5 W0 L1 d
能够跨平台运行在Linux、Window和Mac OS系统上。9 Z/ N" t: `1 A+ [9 Z" J: o- g
5 d6 |/ ], J6 B3 V" `3 p% U/ a
使用信号槽机制进行通信。( ?* d9 l8 G+ L4 i7 @4 c- t
# m+ ?' }# @ V2 r1 |6 k- l9 |
对Qt库进行完全封装。6 G% B! l# M A/ d) I& Q
* |- F4 b& Q. y
可以使用成熟的IDE进行界面设计,并自动生成可执行的Python代码。 c" a. N( s8 S L/ v3 d+ a/ Y j4 h
提供一整套种类齐全的窗口控件。, A. P% L3 V1 m4 E( X* d
. z! P8 y7 F/ r' n o4 ^
PyQt5是由一系列Python模块组成,有超过620个类,6000个函数和方法,主要模块如下:# @4 Z7 }9 N5 d% x
$ d: i' g z+ h" @7 p1 uQtCore:包含了核心的非 GUI 的功能。主要和时间、文件与文件夹、各种数据、流、URLs、mime 类文件、进程与线程一起使用。6 R0 _1 F( C& h
3 t6 h& ^- K' {9 ]8 ]6 @
QtGui:包含了窗口系统、事件处理、2D 图像、基本绘画、字体和文字类。7 a/ N+ u: A0 B/ t$ C4 u' A
6 C" T! K" o* U/ m, iQtWidgets:包含了一系列创建桌面应用的 UI 元素。 ! h( _1 X, j/ P) X; D2 u( H4 Q& N9 Q$ I' u. P1 j' i
QtMultimedia:包含了处理多媒体的内容和调用摄像头 API 的类。 / a1 r1 G+ i3 x" }* \. c1 S/ Q/ U3 M! }# y! f {
QtBluetooth:包含了查找和连接蓝牙的类。 - E$ u V1 J& [7 A. F6 w; P( a8 E( n! c- [9 T
QtNetwork:包含了网络编程的类,这些工具能让 TCP/IP 和 UDP 开发变得更加方便和可靠。 5 v9 g; j, W% C f! [, S5 I) r3 m3 ~5 E) B8 q8 b
QtPositioning:包含了定位的类,可以使用卫星、WiFi 甚至文本。2 V8 F! n Q. _% Z3 H1 I
6 X# y7 I a) D$ P2 [整个画面的构成:+ M4 d5 e) |% v1 F4 R. |2 L
/ D! e a/ X' m- B% T. {* M左侧的“Widget Box”就是各种可以自由拖动的组件8 }7 k+ ~# P/ Y: \) r
! X) t& C. g$ Z B h中间的“MainWindow – untitled”窗体就是画布 . J8 H2 g: M9 k B' |) G( D$ t, ^* @; i
右上方的”Object Inspector”可以查看当前ui的结构6 ^9 N8 m- D8 g9 d
* u o* Y. h% f
右侧中部的”Property Editor”可以设置当前选中组件的属性 0 g f, ^6 j+ |! ~: z' Q2 k 8 q6 R" r5 n8 @+ z右下方的”Resource Browser”可以添加各种素材,比如图片,背景等等7 [4 n( P( Y& G: K" v
: l9 n4 D- U- `7 e ~! P2 A- N最终生成.ui文件(实质上是XML格式的文件),可直接使用,也可以通过pyuic5工具转换成.py文件。 C5 `7 H6 D! B' s% e# P) A, V6 @0 D" M
QtDisigner配置 3 K8 k0 K# F% T4 [5 B3 W1 {4 a* J9 O
在Pycharm中,依次打开 File – Settings – Tools – External Tools,点击 + Create Tool,配置如下: 7 ]& V; h0 q E& m $ l: V4 m! K# R8 q0 c- [$ xName: QtDisigner - [5 v: y! N3 F- e; E' \3 d0 R9 C G& P1 t
Program : D:\Program Files\Python36\Lib\site-packages\qt5_applications\Qt\bin\designer.exe # 请根据实际修改 ) a! x$ R0 j. m m; Q+ p5 z& Z( H. W
Working directory: $FileDir$ " [( S, l. `* S: k& ^% _. bPyUIC配置, R4 N5 H8 M2 F+ l
7 S' H/ P W6 g- M( X7 ?1 HPyUIC主要是把Qt Designer生成的.ui文件换成.py文件。 ) ?% K9 K$ i% y. E& f7 y " i8 V/ N3 }1 `, v在Pycharm中,依次打开 File – Settings – Tools – External Tools,点击 + Create Tool,配置如下: ) N$ }! g+ @) X, }& ]3 P. ^8 e7 X1 [* L1 f
Name: PyUIC - A p! D% `' U7 f G- J | y) L% [( ^Program : D:\Program Files\Python36\python.exe # 当前Python目录,请根据实际修改) ?& D2 k% r3 f4 F( s) D
+ [: x# V6 G0 L" O
Arguments: -m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py( S) }' C1 L. v" e9 B
# y% M2 z% _6 L2 |# U( P: Y! V
Working directory: $FileDir$ 8 H2 P. |5 O- D- G3 v+ {PyRCC配置# k5 D0 r! k j$ t6 k
( r* {4 `8 G+ ]! R f9 E
PyRCC主要是把编写的.qrc资源文件换成.py文件。在Pycharm中,依次打开 File – Settings – Tools – External Tools,点击 + Create Tool,配置如下: 9 c3 J/ _6 \6 F- { x" m# g" a( j# i
Name: PyRCC/ Z& o- ]* _/ U9 C5 a: T+ t
0 B5 k$ d1 T6 R7 j }* S/ v\# WARNING: Any manual changes made to this file will be lost when pyuic5 is $ }$ g, ~. i, ~4 Y- T$ d+ {7 R' V2 L6 h
\# run again. Do not edit this file unless you know what you are doing. 5 t8 m2 {9 q+ }4 s2 \3 S4 C) G/ I+ v5 w. a# ]4 `( R
from PyQt5 import QtCore, QtGui, QtWidgets - `4 ~+ Z: [0 r: H# w , L3 ^9 k8 m. M6 u( d, p3 K" vclass Ui_Dialog(object):! R" \9 k y2 o
" b9 r! G! d5 f/ E; s def setupUi(self, Dialog):) }. K1 Q! S- q. H% W
3 s9 P2 P3 d% i7 y6 a0 d" g
Dialog.setObjectName("Dialog") Y4 \3 p0 J. }( L2 d : i& w! A* ~& }, W+ ~! E Dialog.resize(600, 600)- O; @5 m" {; @( p4 }6 f