学习Python,就不得不提一下Python的图形界面开发,如果只用命令行写程序,用户体验不太好,难以胜任复杂的人机交互场景。Python的图形界面开发库常用的有:Tkinter、wxPython、PyQt、PySide等等。当然还有其他比较优秀的GUI框架,相对来说用的人比较少。这里就上述几个常用的GUI框架展开讨论。

Tkinter是Python的亲生儿子,它是 Python 的标准 GUI 库,简称 “Tk”;从本质上来说,它是对 TCL/TK 工具包的一种 Python 接口封装。Tkinter 是 Python 自带的标准库,因此无须另行安装,它支持跨平台运行,不仅可以在 Windows 平台上运行,还支持在 Linux 和 Mac 平台上运行。

wxPython是Python语言的一套优秀的GUI图形库。允许Python程序员很方便的创建完整的、功能键全的GUI用户界面。 wxPython是作为优秀的跨平台GUI库wxWidgets的Python封装和Python模块的方式提供给用户的。wxPython使用与wxWidgets相同的许可证,即LGPL协议,因此它可以免费的使用在商业软件上,也不需要开源商业软件的代码。

PyQt是一个创建GUI应用程序的工具包。它是Python编程语言和Qt库的成功融合。Qt库是最强大的库之一。PyQt是由Phil Thompson 开发。PyQt实现了一个Python模块集。它有超过300类,将近6000个函数和方法。它是一个多平台的工具包,可以运行在所有主要操作系统上,包括UNIX,Windows和Mac。 PyQt采用双许可证,开发人员可以选择GPL和商业许可。这意味着你开发的代码要么选择开源使用、要么需要交纳一定的商业许可费用。目前最新的版本是PyQt6。

PySide是一个Python的图形化界面(GUI)库,由C++版的Qt开发而来,在用法上基本与C++版没有特别大的差异。相对于其他Python GUI库来说,PySide开发较快,功能更完善,而且文档支持更好。PySide与PyQt相比,前者是Qt公司的产品,是Qt的新儿子,而PyQt是第三方公司的产品,两者语法基本相同,都是Qt在Python上的实现。不过,PySide使用的是LGPL协议,在开发商用代码时,比PyQt更加友好。目前最新的版本是PySide6,对标PyQt6。

上面简单的列举了一下各个GUI库的基本情况,我们再来从易用性、兼容性、高效性以及商用性来对比一下这几个库。

Tkinter是最容易上手的,你安装了Python就已经自带了Tkinter,即装即用,不用再安装配置什么了。由于Tkinter是Python原生的GUI库,所以Tkinter的兼容性是最好的。而且整个Tkinter库很小巧,打包后的程序比其他GUI库要精简很多。如果是做一些简单的界面或工具类程序,Tkinter是个很好的选择。不过,正是由于Tkinter相对简单,在做更复杂的界面时,会显示力不从心,它给你提供的控件没有其他GUI库那么丰富。这样你想实现的功能未必能那么轻松的完成,开发效率也就很难提升。

wxPython提供了较为丰富的组件,同时它还有一个所见即所得的可视化编辑器wxFormBuilder,可以直接用拖拽的方式完成界面设计。但是wxPython的灵活性不足,在开发一些定制化较强的界面时难度较大。虽然wxPython提供了OnPaint方法,可以实现一些定制样式,但是在复杂场景下性能会受到影响。

PyQt相对于Tkinter和wxPython来说,功能更加强大。具有更灵活的界面定制开发能力,它采用了DirectUI机制,可以使用类似CSS机制的QSS来设计界面风格。另外,PyQt可以无缝与C++ Qt整合使用,以解决部分性能问题。Qt Designer是PyQt程序UI界面的实现工具,Qt Designer工具使用简单,可以通过拖拽和点击完成复杂界面设计,并且设计完成的.ui程序可以转换成.py文件供python程序调用。PyQt是好,不过上面我们已经提到过,PyQt采用的是双重许可,要么开源你的代码,要么付费闭源使用。我们自己开发一些程序使用倒无所谓,真正用于商业用途时,需要考虑一下法律问题。

PySide是后起之秀,它比PyQt要晚问世,刚出来的时候由于项目还不完善,缺乏相关文档,所以还不是很火。但是PySide毕竟是Qt的亲生儿子,而PyQt是第三方的,后续又出了PySide2和PySide6(这个跨度有点大,直接从2跳到了6,这也显示了Qt要把PySide做强做大的决心),目前PySide已经日趋完善,再加上PySide是采用的LGPL协议,相信PySide6之后的版本将会成为Python开发者使用Qt的第一选择。

我们来实践一下,每种GUI库写个HelloWorld,再打包成exe对比一下。

Tkinter测试代码如下:

import tkinter as tkroot = tk.Tk()
root.geometry('400x300')w = tk.Label(root, text="Hello World!")
w.pack()root.mainloop()

运行结果

wxPython测试代码如下:

import wxclass MainFrame(wx.Frame):def __init__(self, parent):wx.Frame.__init__(self, parent, wx.ID_ANY, "wxPython4.1 Demo", size=(800, 600))panel = wx.Panel(self)self.text = wx.StaticText(panel, wx.ID_ANY, "Hello World!")sizer_v = wx.BoxSizer(wx.VERTICAL)sizer_h = wx.BoxSizer(wx.HORIZONTAL)sizer_h.Add(self.text, 1, wx.CENTER)sizer_v.Add(sizer_h, 1, wx.CENTER)panel.SetSizer(sizer_v)if __name__ == '__main__':app = wx.App(0)frame = MainFrame(None)frame.CenterOnScreen()frame.Show(True)app.MainLoop()

运行结果

PyQt5测试代码如下:

import sysfrom PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QLabelclass HelloWorld(QWidget):def __init__(self):QWidget.__init__(self)self.text = QLabel("Hello World!")self.text.setAlignment(Qt.AlignCenter)self.layout = QVBoxLayout()self.layout.addWidget(self.text)self.setLayout(self.layout)if __name__ == "__main__":app = QApplication(sys.argv)widget = HelloWorld()widget.setWindowTitle('PyQt5 Demo')widget.resize(400, 300)widget.show()sys.exit(app.exec())

运行结果

PyQt6测试代码如下:

import sysfrom PyQt6.QtWidgets import QWidget, QApplication, QVBoxLayout, QLabelclass HelloWorld(QWidget):def __init__(self):QWidget.__init__(self)self.text = QLabel("Hello World!")# self.text.setAlignment(Qt.AlignCenter)self.layout = QVBoxLayout()self.layout.addWidget(self.text)self.setLayout(self.layout)if __name__ == "__main__":app = QApplication(sys.argv)widget = HelloWorld()widget.setWindowTitle('PyQt6 Demo')widget.resize(400, 300)widget.show()sys.exit(app.exec())

运行结果

PySide6测试代码如下:

import sys
from PySide6.QtCore import Qt
from PySide6.QtWidgets import (QApplication, QWidget, QLabel, QVBoxLayout)class HelloWorld(QWidget):def __init__(self):QWidget.__init__(self)self.text = QLabel("Hello World!")self.text.setAlignment(Qt.AlignCenter)self.layout = QVBoxLayout()self.layout.addWidget(self.text)self.setLayout(self.layout)if __name__ == "__main__":app = QApplication(sys.argv)widget = HelloWorld()widget.setWindowTitle('PySide6 Demo')widget.resize(400, 300)widget.show()sys.exit(app.exec_())

测试结果

用PyInstaller打包后文件大小分别是:

Tkinter8.6                8.75M

wxPython4.1.1        13.1M

PyQt5                      34.1M

PyQt6                      27.1M

PySide6                  35.2M

其中Python统一使用的是3.8.10,Tkinter8.6、wxPython4.1.1和PyQt5兼容Win7,

PyQt6不兼容Win7

PySide6只有PySide6.01兼容Win7操作系统,后续版本包括PySide6.3.1都不兼容Win7操作系统。

  讲了这么多,这几个GUI库的优缺点大概都清楚了,每个人都有自己的侧重,根据自己的需求和喜好选择。

  我个人感觉,Tkinter过于简单,组件不是很齐全。wxPython组件比较丰富,做一些工具软件或小型软件是完全没问题的。以后做复杂一点的需求,就考虑用PySide6以及后续版本。毕竟它跟wxPython一样也是LGPL协议的,而且PySide6是Qt亲生的。PyQt虽然也很优秀,但是它的双重许可总让人觉得有点忐忑。

  wxPython的官方demo很不错,有很丰富的示例程序。我用wxPython写了两个小程序,截图如下,后面整理完了会陆续发出来。想跟我一起学习、一起进步的同学请关注一下,后面会更精彩,谢谢!

Python学习笔记——开发图形界面wxPython、PyQt、PySide选哪一个?相关推荐

  1. Python学习笔记·交互式图形编程

    Python学习笔记·交互式图形编程 注:在校计算机学生一名,菜鸟一枚,最近开始学习Python的基础知识希望有什么不对的地方各位大佬能够不令赐教! 课程是在中国大学MOOC上学的,有兴趣的同学可以自 ...

  2. Python上位机软件图形界面实战——PyQt

    转载:https://blog.csdn.net/qq_25939803/article/details/97894219 文章目录 引言 1 环境配置 2 新建一个软件窗口 3 QtDesigner ...

  3. 爱上hal库学习笔记——cubemx图形界面,洋桃电子YYDS

    新建工程 选择封装芯片型号 3.图形界面  (一)系统内核 DMA 直接存储器访问:可不通过CPU程序处理直接从某个功能自动读出数据 GPIO 通用输入输出端口:可把电平输入输出,读取按键和控制LED ...

  4. java图形界面的监听_非专业码农 JAVA学习笔记 用户图形界面设计与实现-所有控件的监听事件...

    用户图形界面设计与实现-监听事件 System.applet.Applet (一)用户自定义成分 1.绘制图形 Public voit piant(Ghraphics g){  g.drawLine等 ...

  5. python打开界面是什么样的-python学习笔记(图形用户界面)

    GUI python提供了多个图形开发界面的库,几个常用Python GUI库如下: Tkinter: Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的 ...

  6. python打开界面-python学习笔记(图形用户界面)

    GUI python提供了多个图形开发界面的库,几个常用Python GUI库如下: Tkinter: Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的 ...

  7. 学Python划重点 四 (图形界面wxPython 库的使用)

    构建一个最简单的wxPython 程序至少需要一个wx.App 对象和一个wx.Frame 对象. 模板: import wx # 加载模块# 继承窗体类 class MyFrame(wx.Frame ...

  8. Python学习笔记007_图形用户界面[EasyGui][Tkinter]

    EasyGui官网:http://easygui.sourceforge.net/ EasyGui最新版:easygui-0.97.rar 小甲鱼根据官网文档翻译之后的中文文档地址: http://b ...

  9. Python学习笔记--exe文件打包与UI界面设计

    exe文件打包与UI界面设计 前言 一.基于tkinter实现的UI设计 1.1 库的选择及思路 1.2 定位方法的选用 1.3 Frame控件 1.4 变量设置 1.5 批量设置 1.6 Text文 ...

最新文章

  1. 力扣—— 三维形体投影面积
  2. DNS Tunneling及相关实现——总之,你发起攻击都需要一个DNS server,下载一些工具作为client发起数据,server收集数据并响应...
  3. Android 中intent传递序列化信息(传递类)
  4. Java 面试题 —— 老田的蚂蚁金服面试经历
  5. 纽约大学计算机和信息科学专业排名,纽约大学计算机科学与信息系统世界排名2018年最新排名第33(QS世界排名)...
  6. java规则表达式_Java基础--正则表达式的规则
  7. 基于visual c++之windows核心编程代码分析(30)Telnet协议编程
  8. 结构与算法(04):排序规则与查找算法
  9. mongodb数据合并设计_MongoDB:将来自多个集合的数据合并成一个
  10. 关于微软企业库中依赖注入容器Unity两种生成对象的实现
  11. 附件下载原来如此简单
  12. css分类及其它技巧
  13. bpm js 计算 音乐_构建Node.js和Arduino执行控制
  14. [圣诞大礼][android控]平板电脑HD精品游戏软件合集
  15. 到底什么是移动边缘计算?
  16. 【MySQL】多表查询事务权限管理
  17. Win10 安装 Rational Rose 教程(带超详细图文)
  18. 如何实现图片转化为文字
  19. 7-2 然后是几点 (15 分)
  20. 异常 exception

热门文章

  1. live555 学习笔记-建立RTSP连接的过程(RTSP服务器端)
  2. Chrome插件5: 点击插件超链接 自动百度
  3. 一文看懂三极管的截止、饱和
  4. 餐饮招商加盟高端模版PPT模板
  5. 武汉理工大学计算机考研资料汇总
  6. linux下phy接光模块,C6638,linux mac to mac 模式(没PHY),接SFP+模块,通过光纤(30cm)与PC连接。在PC显示该网络链路为10Gbps,网口问题...
  7. ArcScene---修改图层字段
  8. Ubuntu 搜狗输入法显示繁体,一直不显示简体
  9. cypress代理商与ic芯片有哪些品牌
  10. C语言sin函数实现(基于泰勒公式)