标题: 超全!Python图形界面框架PyQt5使用指南! [打印本页] 作者: 杨利霞 时间: 2022-9-15 12:26 标题: 超全!Python图形界面框架PyQt5使用指南! 超全!Python图形界面框架PyQt5使用指南!8 k( x2 @% P3 }9 S6 [
$ {6 ?1 n4 q! I$ s3 s# L
使用Python开发图形界面的软件其实并不多,相对于GUI界面,可能Web方式的应用更受人欢迎。但对于像我一样对其他编程语言比如C#或WPF并不熟悉的人来说,未必不是一个好的工具。) U$ _; e0 ~8 j4 j% w0 A
# ?4 M- D/ d* o8 \
常见GUI框架 4 }# V4 S( k' Y: _' {5 L1 x. X3 l9 i! `
PyQt5:Qt是一个跨平台的 C++图形用户界面库。QT一度被诺基亚拥,后出售给芬兰的软件公司Digia Oyj。PyQt5是基于Digia公司Qt5的Python接口,由一组Python模块构成。PyQt5本身拥有超过620个类和6000函数及方法。在可以运行于多个平台,包括:Unix, Windows, and Mac OS。 * g4 N$ Q. {0 Q 6 }, A; U1 S) `Pyside6:Pyside是QT公司官方提供的Python包,上一版本为Pyside2,对应的是QT5,最新版命名规则进行了调整,更改为Pyside6,对应的是QT6版本。由于官方出品的比较看好,缺点是发布比较晚,网上的资料没有PyQt5多。* {) H" H( x) d
/ M) r$ q, d! [+ x
Tkinter:Python内置的GUI框架,使用TCL实现,Python中内嵌了TCL解释器,使用它的时候不用安装额外的扩展包,直接import,跨平台。不足之处在于UI布局全靠代码实现,只有15种常用部件,显示效果简陋。 4 ]) o: X9 L; y f7 O ( |( O- L* \ [1 a" i+ tPySimpleGUI:PySimpleGUI 是 Tkinter 一层包装。使用 PySimpleGUI 实现自定义 GUI 所需的代码量要比使用 Tkinter 直接编写相同的 GUI 要少得多。 % E4 j8 X( X* W7 q$ T2 h. }- U& C2 h& F2 S, _
WxPython:wxPython是Python语言对流行的wxWidgets跨平台GUI工具库的绑定。用得比较广泛,跨平台,C++编写,文档少,用户可能就需要根据编程内容对不同平台中的GUI代码做一些调整。遇到问题不好解决,代码布局控件,不直观。, B; E) f! l: B( i0 O8 L
) Z% r. P) ]+ O
Wax:基于wxPython ,为克服wxPython的问题而制作的一个包。 Z2 _7 F% ?" V `
- p5 }* B7 k" S6 c) g* o E
Kivy:主要针对多点触控程序,智能手机平板等,也可以在没有触屏功能的系统上,全平台支持(Windows, Linux, Mac OS X, Android and iOS.)使用Python和cython编写,中文支持差,需要自己下载中文库并且制定路径。1 T( T) m8 m# q1 {8 v# S' j/ x
0 m( R3 K/ u/ K
BeeWare:Write once. Deploy everywhere.需要与Kivy配合使用。: p( x0 e7 G# W$ ~, }8 p
/ M8 S! y" s: J% [3 KToga:一个使用Python开发原生APP的GUI工具包。Toga由一个具有共享接口的基础组件库组成,以简化与平台无关的GUI开发。Toga适用于Mac OS、Windows、Linux(GTK)以及Android和iOS等移动平台。 . Y" c" s6 @% v* M $ U2 q2 _. Z2 lEel:一个轻量的 Python 库,用于制作简单的类似于 Electron(但是比它更轻量) 的离线 HTML/JS GUI 应用程序,并具有对 Python 功能(capabilities)和库的完全访问权限。 ( h) D3 l; X( [. p, ] B/ z O* X3 r
Flexx:一个纯 Python 工具包,用来创建图形化界面应用程序。其使用 Web 技术进行界面的渲染。你可以用 Flexx 来创建桌面应用,同时也可以导出一个应用到独立的 HTML 文档。因为使用纯 Python 开发,所以 Flexx 是跨平台的。只需要有 Python 和浏览器就可以运行。 7 w' [6 e; q( L ; D; |4 _ y- ~& H+ spywebview是围绕 webview 组件的轻量型跨平台包装器(wrapper),它允许在其自己的本机 GUI 窗口中显示 HTML 内容。它使您可以在桌面应用程序中使用 Web 技术,同时尽最大可能隐藏使用浏览器构建GUI的事实。6 N& ]" y# S1 a+ w! V5 ~/ O7 d
: y! M& L, X* B4 _
enaml:一种能够让你用最小的努力就可以实现高质量GUI界面的的Python框架,也是一种独特的编程语言。enaml将声明性语言与基于约束的布局系统结合在一起,使用户可以轻松地定义灵活布局的UI。enaml应用程序可以在任何支持Python和Qt的平台上运行。 * V" j6 L# h7 r5 H C$ r. ?4 d( C' _' m; ~" l q% j) E5 d
个人想法:太多学不完,先学PyQt5,原因是资料多,学有余力再学pyside6,最后看下PySimpleGUI,看能否解决一些简单问题。4 x, x, p/ V' j. {" W. B) f
! ?- a( m/ b2 @6 M% s* C# N* O
PyQt5简介! l& c3 x! T, [
) U1 H$ c6 ?* W! h) f! v7 U6 |( A
PyQt是Qt框架的Python语言实现,由Riverbank Computing开发,是最强大的GUI库之一。PyQt提供了一个设计良好的窗口控件集合,每一个PyQt控件都对应一个Qt控件,因此PyQt的API接口与Qt的API接口很接近,但PyQt不再使用QMake系统和Q_OBJECT宏。( i# j n; K3 ?; K% b
5 d8 Y# s3 j7 J' V* m2 O; O- X q. l
PyQt5提供GPL版和商业版证书,自由开发者可以使用免费的GPL许可,如果需要将PyQt用于商业应用,则必须购买商业许可。 , ^2 t- e# o, C7 _ ! ]: u, H: A8 R: Q& Y3 a% B3 kPyQt5特性如下: 1 h+ d L* f2 }7 [0 {% u1 |; N( k( r" k* ~7 }
基于高性能的Qt的GUI控件集。 $ [, W; l9 Q1 m/ a8 G5 F- y/ N8 B4 @ Z
能够跨平台运行在Linux、Window和Mac OS系统上。 5 g g0 `. K5 Y- O8 o& L 5 P9 S0 H3 Q b% I S) C- a使用信号槽机制进行通信。 # \5 v& M3 I& H4 {0 p3 J7 S* k! h7 Z4 P$ N0 C
对Qt库进行完全封装。 : Z; O) ?( @3 w8 U+ r9 s % p' ]# X& Q2 ^; f0 D$ y0 L可以使用成熟的IDE进行界面设计,并自动生成可执行的Python代码。% ^( D6 X" H, e+ k: K( m' c" T
! Z/ }2 L7 t% t提供一整套种类齐全的窗口控件。" u1 Y# z: P1 y! |
( n: Z, @4 d' v k
PyQt5是由一系列Python模块组成,有超过620个类,6000个函数和方法,主要模块如下:. ^: v5 i! h) P. s
, K! ?" Q1 T# ^9 l0 r' KQtCore:包含了核心的非 GUI 的功能。主要和时间、文件与文件夹、各种数据、流、URLs、mime 类文件、进程与线程一起使用。7 t* a( `* S1 ~ y1 e5 u8 e
7 i* B5 Z3 S+ {
QtGui:包含了窗口系统、事件处理、2D 图像、基本绘画、字体和文字类。* a1 [8 B3 U. p- @6 o& t- _
9 B7 Z: m: k3 ^: _. j
QtWidgets:包含了一系列创建桌面应用的 UI 元素。& X; }; Y/ } B. e8 A
$ @+ n, A% K. K4 ~
QtMultimedia:包含了处理多媒体的内容和调用摄像头 API 的类。" H& k- n0 X$ ]: I X# x) j8 J
- R6 m. p# \9 |7 I# T1 F
QtBluetooth:包含了查找和连接蓝牙的类。5 q0 _% l! a/ Q
7 I- _+ k5 @0 Z9 r- r) a* v! a0 @
QtNetwork:包含了网络编程的类,这些工具能让 TCP/IP 和 UDP 开发变得更加方便和可靠。. z. d; k4 }% _7 M# c
' z9 S# m6 w# C* |QtPositioning:包含了定位的类,可以使用卫星、WiFi 甚至文本。4 u" t0 T2 u& y4 s. P
! K: u4 C; [8 x6 I. ~( ?Enginio:包含了通过客户端进入和管理 Qt Cloud 的类。 9 c( F' w- y) o- O- N7 y' U8 y B. P% Y ~1 I
QtWebSockets:包含了 WebSocket 协议的类。 D" n, a" k6 ~7 r% G0 o
0 M& n9 s! y8 [# u/ ?2 B d1 UQtWebKit:包含了一个基 WebKit2 的 web 浏览器。 0 r; R2 M1 L( e- }$ j2 c $ m! T: n. G: M1 I* r, TQtWebKitWidgets:包含了基于 QtWidgets 的 WebKit1 的类。* H/ P5 |, _* W7 D8 R7 ^# F- F
3 ~+ J2 v/ r4 N
QtXml:包含了处理 xml 的类,提供了 SAX 和 DOM API 的工具。- ~) Q% Z3 N8 v. j3 }0 h$ @0 k
3 l. }" ~2 W7 N* n) r1 L6 A
QtSvg:提供了显示 SVG 内容的类,Scalable Vector Graphics (SVG) 是一种是一种基于可扩展标记语言 (XML),用于描述二维矢量图形的图形格式(这句话来自于维基百科)。 * U+ y% v3 p: h1 r" M8 i: S3 X, q: c A# C% F) ^
QtSql:提供了处理数据库的工具。 \* {) j# Z9 h2 Y3 b) e0 ?' P+ e2 K. @- Q5 b* o# Q
QtTest:提供了测试 PyQt5 应用的工具。% x6 J8 @' z2 p3 \( Z8 D5 k
+ G0 Y, l: q+ Y0 a$ B$ S4 [, w" TPyQt5的安装 ; m; O8 j) _7 D' W% h. n% a+ Y6 z9 y+ Y
由于后期要使用fbs进行打包,fbs对Python 3.7以后的版本可能存在兼容问题,所以我选择了Python 3.6.8进行了整个环境的搭建。主要内容为:Python + PyCharm + PyQt5 9 K2 z5 \4 R$ |- N2 j2 K" Z8 q& L& S+ b8 h9 U) a# f
安装PyQt52 |) I3 a2 q# J" O
9 y; o$ S% t( V `! u9 Z4 ^
pip install pyqt5 & j1 t) w, @3 \9 p, g; U0 w9 \" F% G! f8 t
pip install pyqt5-tools' Z5 k% g" u% M9 M
其中pyqt5-tools为Qt Designer拖拽式的界面设计工具。安装过程中可能会报如下错误:/ G H7 O: p s; x
8 G" R: a/ ]% p* V, Y" d0 x! A) iqt5-tools 5.15.2.1.2 has requirement click~=7.0, but you'll have click 8.0.1 which is incompatible. " d9 A2 b8 s: q, ^7 ?: Y解决方案: 4 Z8 ?- A& h5 {. F3 x; A5 X! \5 A9 {9 H0 i' {# \+ T8 k8 p) A
pip install click~=7.04 Q) ~: I2 a1 N" J, `0 n4 F
Qt Designer的配置' {: ]4 ?7 g' l/ y+ P1 w+ n
: @4 C4 p6 M% M, S4 n' K- E e
Qt Designer 是通过拖拽的方式放置控件,并实时查看控件效果进行快速UI设计。 3 T( |0 \" D# H0 x1 N) ~8 b: k R2 c }4 Z n
9 I; a: Y* ^- J% I. i$ G % ]4 g! m; q9 }) Y3 f; [8 E整个画面的构成:, [2 v' Z/ ^1 v) `/ U4 L$ h
/ }$ s, n3 r/ R) ]* f; M* q, U- M
左侧的“Widget Box”就是各种可以自由拖动的组件3 }0 w3 e* T: U" ]) g
9 P( ~* R& d# s4 K\# self.queryBtn.clicked.connect(Dialog.accept) 3 f. r4 X1 a4 m, j* @' Q: e" V# u8 y& I* D' U8 O
\# self.clearBtn.clicked.connect(Dialog.accept) # e; @7 K0 ?8 z# x# E& b0 [- U- _8 l+ G% x
\# 修改为: g( u, q! `$ s
9 R0 `/ T- g$ K' W( X
self.queryBtn.clicked.connect(Dialog.queryWeather)% J6 N- `/ f( F1 f: B4 o
! x% K7 d! N$ `% ~( T
self.clearBtn.clicked.connect(Dialog.clearText), y9 C; N+ k6 g" c* W" u; P% y
最终的Weather.py内容如下: 5 d1 {4 T/ q, @) S0 S 6 M$ o+ E: l; Y( |' ^1 w( h\# -*- coding: utf-8 -*- - p/ f- L6 h: P- W& T2 c, W2 _2 W$ l6 | d# w, P V
\# Form implementation generated from reading ui file 'Weather.ui'0 y- a: S5 x6 i0 r7 }% h
& ?/ h6 w8 K2 x$ \1 z
\# ) [" M+ z7 d: ~& P; O/ y2 A B5 S$ s4 D2 A$ ]+ \3 @\# Created by: PyQt5 UI code generator 5.15.45 W1 S) \: m) n4 @! Q7 s h! k
# u. i5 _" y) e+ u! o: U\#$ G/ L, f$ W0 y9 G7 L$ E
, |0 k5 B- I0 w) D. Y$ P
\# WARNING: Any manual changes made to this file will be lost when pyuic5 is: D3 t- x8 C2 S- y- Y7 p
4 d4 m$ _$ {" b. S2 b\# run again. Do not edit this file unless you know what you are doing.& ~) B4 }9 W2 Q" C' r. X8 B
5 d9 b) Z! N7 Q* s3 x" Ufrom PyQt5 import QtCore, QtGui, QtWidgets 3 u& H' e1 ~0 S, H# n 3 M4 l8 d' r2 D1 ]class Ui_Dialog(object): 6 S# O" |. V! a3 V) q7 n" k: l5 X$ }2 V. F# V
def setupUi(self, Dialog):* N+ e2 T8 V' x& B2 K; N
* J/ h: H( c& U) W d% b3 ~. |! C5 R
Dialog.setObjectName("Dialog") 9 u( u4 l5 U4 o: e6 _; U! @7 ~' [ ' I4 C+ o# u3 }) Z; K Dialog.resize(600, 600)4 P, h: a# c8 V6 u
8 Q, @1 p4 W6 w7 s# ~; Jimport Weather ' x2 X6 z9 y7 Y2 o, Y* i % k( \3 k$ W" C! Y/ ]: E( X; D. H% ifrom PyQt5.QtWidgets import QApplication, QDialog / L; Z7 }6 L' o: I; X( t9 b, T* s5 _4 I$ T9 _" X
import requests $ L% G4 B0 K2 p- t + r0 F* p: l; [4 X1 iclass MainDialog(QDialog):$ b2 K' Z7 J2 u8 q( h' V
2 X2 ]1 J s1 { def __init__(self, parent=None):) e* Z5 C& d% [( k6 u
2 l9 B. V; H8 Y. F/ _$ O N
super(QDialog, self).__init__(parent)7 d$ X3 w1 d) L' o3 P
- o, ]5 N! y' ~- p$ g S
self.ui = Weather.Ui_Dialog()) i" V; i% B. b6 n5 U" W
- a; n+ y* J3 o) U" h, P
self.ui.setupUi(self)! }; a; G' A) L2 a0 f
6 ]+ a/ N! `, t) V def queryWeather(self):9 Y9 X7 V$ s x+ U' x8 ^: d- M
+ _4 y& d+ e/ @( N9 B cityName = self.ui.comboBox.currentText() 7 Z( l; |: w( T' n" z2 `1 V3 z% O1 V8 n+ |4 L, }. I6 B+ A) N
cityCode = self.getCode(cityName) ' [4 k6 G5 i; }! s8 p2 r' c* B6 `" A9 s+ f. s8 |$ X/ N$ P
r = requests.get(8 a6 S: _' U/ C/ B {, r# s
# B8 m" t0 h+ C. p2 H, n; k. W
"https://restapi.amap.com/v3/weather/weatherInfo?key=f4fd5b287b6d7d51a3c60fee24e42002&city={}".format( / H5 v6 H3 K( x5 x! {9 f: e; g8 I4 m+ u4 {5 j; A
cityCode)) $ X( V# k& b4 w! a3 G) ~9 Z0 _0 C+ R% H; F2 U! c+ L
if r.status_code == 200:* V# f1 H" E& e% U# [
) h6 ?0 g! Y0 I* v8 L) ]
data = r.json()['lives'][0]: `8 J; G' g& d( w# X- S
* \* w m( I/ x+ N2 J/ X9 |2 B% Jpyinstaller:明确支持win8、win10、理论上支持win7,,支持apple Macos, linux。pyinsaller可以打包成文件夹形式内含exe入口执行文件的形式,也可以是一个单独的exe文件。 * R+ X" Y- |0 m# m* J6 ^; K- A1 c1 Y8 k+ `: J
fbs:基于PyInstaller,使用起来更加方便 ) d( O2 @' C6 f( p, |1 c/ b: } ; \% M) l2 Q U( v! Q. K& g这里选择了fbs来打包。fbs的安装方法:4 X, T" R* |% f1 {( h+ U% V
, S2 g# \+ w: B% G" w l
pip install fbs, u9 u. B& ?0 n: |- V* B
使用方法,在命令行中输入: - @+ W2 x A# R+ n8 q x8 }* ~- ^/ F/ [6 s5 A) a. t* r1 W
fbs startproject 8 ~% ]/ c5 C$ `5 _* p; u* P执行完成后需要输入一些APP的名称等。完成后会生成如下目录:! x h4 N' p }) m- G( F, w
: H6 T! F, u1 w+ h/ N8 @5 E
6 @1 P6 m$ B, _ 0 h p q ^6 }$ ~% j将刚才编写的PyQt5的代码(demo.py和Weather.py)拖到src/main/python文件夹下,删除原有的main.py,并将demo.py修改为main.py。然后打开 main.py,在文件头部添加如下代码:4 z$ @6 C; v- [# a0 i) M
0 b7 J/ C3 H5 ufrom fbs_runtime.application_context.PyQt5 import ApplicationContext. E: P* `5 a) M Y, ^5 t
```4 q$ J% r/ s& G+ s4 f1 R- ~3 ? @
完成后执行: ( V M: l j6 }& b. m```' T5 ~4 E, D& F# q. _. ?4 D
fbs freeze ( f8 }$ p P& X* }, C```. z. U# x% s& L' d9 G6 D2 `- I
即可实现打包。生成的exe可执行文件在\target\MyApp文件下。8 }% u5 h8 C; T7 U0 K2 l( R1 ~0 D
3 S J. ^- S q6 T2 H
————————————————7 Q8 I: J+ N+ b N
版权声明:本文为CSDN博主「宋宋讲编程」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 m6 @) a$ l8 ^% d* n
原文链接:https://blog.csdn.net/qiqi1220/article/details/1262896673 {( R/ m: |5 e- m' X
/ p' b0 F' `2 a0 x* }- o6 y: r0 p1 Q4 k7 B5 e" K9 `0 `* }