手把手带你用PyQt5做小型桌面应用

2,260 阅读6分钟

桌面应用

什么是桌面应用? 即在操作系统的可视化的桌面上,可以运行的程序。

在这里插入图片描述 在这里插入图片描述 比如说QQ,微信、爱奇艺等这些都是桌面应用。

早期开发桌面应用,都用哪些语言呢?

桌面应用软件,在操作系统中,通过操作系统桌面窗体展现应用内容,并实现用户交互操作。编程语言有很多种,但并不是每一种语言都具有支持UI开发的能力,很多语言支持UI开发能力,是有人专门为之实现的UI开发支持平台。简单地说,需要有专门的语言UI库支持,如C++中的Qt库、MFC库,Java的Swing、AWT相关依赖库,否则语言是没办法进行快速UI开发的。

现在我们可以用Python开发啦,简单高效!那 Python开发桌面应用直接就可以开发吗?

不是的!要安装Python的PyQt5开发GUI程序。PyQt5是基于C++的Qt5库,Qt5是用于桌面应用开发,PyQt5是将C++实现的Qt5封装成Python方便使用的库包。

简单介绍下什么是PyQt5。

PyQt是一个创建GUI应用程序的工具包。它是Python编程语言和Qt库的成功融合。Qt库是目前最强大的库之一。PyQt是由Phil Thompson 开发。

PyQt 是一个Python模块集, 它有超过300类,将近6000个函数和方法。它是一个多平台的工具包,可以运行在所有主要操作系统上,包括UNIX,Windows和Mac。 PyQt采用双许可证,开发人员可以选择GPL和商业许可。在此之前,GPL的版本只能用在Unix上,从PyQt的版本4开始,GPL许可证可用于所有支持的平台。

PyQt5可以做这些桌面程序。 在这里插入图片描述

环境安装

Conda环境

建议安装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
PyCharm工具

编码IDE开发工具使用PyCharm, 需要增加两个Tools扩展工具。

  • UI设计工具

在工具的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中增加pyuic5Tool settings的Program是pyuic5,Parameters是$FileName$ -o $FileNameWithoutExtension$_rc.py,Working director是$FileDir$

实战:PyQt5+Socket实现中心化网络服务

因为需要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。 在这里插入图片描述