什么是桌面应用? 即在操作系统的可视化的桌面上,可以运行的程序。
早期开发桌面应用,都用哪些语言呢?
桌面应用软件,在操作系统中,通过操作系统桌面窗体展现应用内容,并实现用户交互操作。编程语言有很多种,但并不是每一种语言都具有支持UI开发的能力,很多语言支持UI开发能力,是有人专门为之实现的UI开发支持平台。简单地说,需要有专门的语言UI库支持,如C++中的Qt库、MFC库,Java的Swing、AWT相关依赖库,否则语言是没办法进行快速UI开发的。
现在我们可以用Python开发啦,简单高效!那 Python开发桌面应用直接就可以开发吗?
不是的!要安装Python的PyQt5开发GUI程序。PyQt5是基于C++的Qt5库,Qt5是用于桌面应用开发,PyQt5是将C++实现的Qt5封装成Python方便使用的库包。
PyQt是一个创建GUI应用程序的工具包。它是Python编程语言和Qt库的成功融合。Qt库是目前最强大的库之一。PyQt是由Phil Thompson 开发。
PyQt 是一个Python模块集, 它有超过300类,将近6000个函数和方法。它是一个多平台的工具包,可以运行在所有主要操作系统上,包括UNIX,Windows和Mac。 PyQt采用双许可证,开发人员可以选择GPL和商业许可。在此之前,GPL的版本只能用在Unix上,从PyQt的版本4开始,GPL许可证可用于所有支持的平台。
建议安装anaconda集成环境,简称conda环境, 内部默认安装数据分析(Numpy/Pandas)、爬虫Scrapy框架、Web框架、PyQt等相关工具。以下是安装之后目录:
drwxr-xr-x 3 apple staff 96 2 25 2019 Anaconda-Navigator.app
drwxr-xr-x 449 apple staff 14368 10 10 18:48 bin
drwxr-xr-x 269 apple staff 8608 2 25 2019 conda-meta
drwxr-xr-x 3 apple staff 96 2 25 2019 doc
drwxr-xr-x 9 apple staff 288 11 26 14:40 envs
drwxr-xr-x 6 apple staff 192 2 25 2019 etc
drwxr-xr-x 305 apple staff 9760 5 17 2019 include
drwxr-xr-x 732 apple staff 23424 2 25 2019 lib
drwxr-xr-x 5 apple staff 160 2 25 2019 libexec
drwxr-xr-x 3 apple staff 96 2 25 2019 man
drwxr-xr-x 68 apple staff 2176 2 25 2019 mkspecs
-rw-rw-r-- 1 apple staff 745 2 25 2019 org.freedesktop.dbus-session.plist
drwxr-xr-x 15 apple staff 480 2 25 2019 phrasebooks
drwxr-xr-x 1086 apple staff 34752 9 29 18:05 pkgs
drwxr-xr-x 25 apple staff 800 2 25 2019 plugins
drwxr-xr-x 3 apple staff 96 2 25 2019 python.app
drwxr-xr-x 27 apple staff 864 2 25 2019 qml
drwxr-xr-x 7 apple staff 224 2 25 2019 resources
drwxr-xr-x 14 apple staff 448 2 25 2019 sbin
drwxr-xr-x 25 apple staff 800 2 25 2019 share
drwxr-xr-x 9 apple staff 288 2 25 2019 ssl
drwxr-xr-x 290 apple staff 9280 2 25 2019 translations
在 bin目录下,存在一个Designer.app
应用是PyQt的Designer设计器。文件的扩展名是.ui。
因为Conda安装之后,默认是base环境,所以可以使用Coda命令创建新的开发环境:
conda create -n gui python=python3.7
激活环境
conda activate gui
安装pyqt5
(gui) > pip install pyqt5==5.10
如果安装的PyQt5版本高于5.10,部分库将要单独安装,如WebEngine
(gui) > pip install PyQtWebEngine
编码IDE开发工具使用PyCharm, 需要增加两个Tools扩展工具。
在工具的settings页面的左侧找到Tools
菜单项, 选择它并点击右边的+
按钮增加新的工具,在’Name’输入框中输入 qtDisigner 并在下面的Tool settings
中Program指定程序的完整路径。如在Mac环境下/Users/apple/anaconda3/bin/Designer.app
, 并在Working directory
输入$FileDir$
。
Window 7/10下设置时需要注意,如果Anaconda安装在C盘用户的目录下,需要在CMD中安装pyqt-tools,并从用户的目录下找到Designer.exe。
pip install pyqt5-tools==5.9.2.1.3 --user
安装成功后,Program位置则在C:\Users\{用户名}\AppData\Roaming\Python\Python37\site-packages\pyqt5_tools\designer.exe
另外,Working directory工作目录也可以设置为当前项目目录。
当ui设计完成后,需要将ui转成py脚本,进一步编码。与增加ui设计工具相同,在Tools中增加pyuic5
,Tool settings
的Program是pyuic5
,Parameters是$FileName$ -o $FileNameWithoutExtension$_rc.py
,Working director是$FileDir$
。
因为需要socket,所以简单介绍一下socket。
Socket是什么呢?
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤 :
(1)服务器监听。
(2)客户端请求。
(3)连接确认
生活中的场景就是:
一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。 生活中的场景就解释了这工作原理。
所以我们要想实现PyQt5+Socket就要准备客户端和服务器端:
服务器端(部分代码):
if __name__ == '__main__':
datas = DataSource().load()
# 创建socket应用服务
server = socket.socket()
server.bind(('localhost', 18900)) # 绑定主机IP和Host
server.listen()
print('中心服务已启动\n等待客户端连接...')
while True:
client, addr = server.accept()
ClientThread(client, addr).start()
time.sleep(0.5)
客户端(部分代码):
class CenterClient():
def __init__(self, server, port):
super().__init__()
self.server = server
self.port = port
self.isConnected = False
self.client = None
def connect(self):
self.client = socket.socket()
self.client.connect((self.server, self.port))
msg = self.client.recv(8*1024)
if msg == b'OK 200':
print('---连接成功--')
self.isConnected = True
else:
print('---连接失败---')
self.isConnected = False
def send_cmd(self, cmd):
self.client.send(cmd.encode('utf-8'))
data = self.client.recv(8*1024)
print('{}命令结果: {}'.format(cmd, data))
if data == b'Error':
return '400'
return data.decode('utf-8')
效果展示:
本文详细代码和视频教程,已上传网盘,公众号「Python专栏」回复桌面应用
进行领取。
如果有什么疑问,可以联系我们加入免费体验课或答疑Q群:591897914。