百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

wxPython和PyQt谁才是最赞的Python GUI库

wuantov 2025-08-01 21:43 4 浏览

Python是一种解释型、面向对象、动态数据类型的高级程序设计语言,Python GUI图形库允许Python程序员很方便的创建完整的、功能键全的GUI用户界面。作为Python开发者,你迟早都会用到图形用户界面来开发应用,wxPython和PyQt是两个最受欢迎的Python GUI框架,它们之间有何区别?在实际应用中又该如何选择呢?

外观

根据我们的经验,大多数用户在使用应用程序时首先关注的一定是应用程序的外观,所以我们先来比较一下wxPython和PyQt的外观。

wxPython是Python语言对流行的wxWidgets跨平台GUI工具库的绑定。而wxWidgets是用C++语言写成的,所以在GUI中编写按钮小部件的代码时,不会看到类似于另一个操作系统的东西。

▲基于Linux的Thunar和wxPython

PyQt也是使用C++编写的,它基于著名的Qt工具包。与wxPython不同的是,它不使用native

widget,而是根据它检测到操作系统创建小部件的近似值。但是它的近似可以说是做到了极致,就连艺术生基本都分辨不出其与原生有何不同。

如果您使用KDE,可以使用其他PyKDE库来弥补原始PyQt与Linux和BSD之间Plasma desktop外观之间的差距,但这增加了新的依赖关系。

▲基于Linux的KDE和Qt

跨平台

wxPython和PyQt都支持Linux,Windows和Mac,因此它们都非常适合跨平台;但是这种跨平台并不是无条件的,想要你的Python代码在特定平台中运行还需要进行一些调整,如GUI工具包无法将路径格式调整为数据目录,因此必须在Python中运行最佳实践,使用os.path.join和几个不同的退出方法等等。 GUI工具包的选择不会从平台上神奇地抽象出来。

PyQt正在努力的消除跨平台差异,允许Python本身需要的常见调整。PyQt可以避免大多数跨平台问题,所以在不同的操作系统中,GUI代码基本都可以保持不变。

在wxPython中,用户可能就需要根据编程内容对不同平台中的GUI代码做一些调整。例如,为了防止Microsoft Windows上的某些元素闪烁,USE_BUFFERED_DC属性必须设置为True才能对图形进行双缓冲。这不是默认的,即使可以无条件地对所有平台进行操作,因此在某些用例中可能存在缺陷。

安装

作为开发人员,您可能不关心获取应用程序所需的库所需的安装步骤; 但是,如果您计划分发应用程序,则需要考虑用户为了使程序运行所必须执行的安装过程。

在所有平台上安装Qt与安装任何其他应用程序一样简单, 给用户一个下载的链接,然后安装下载的软件包即可使用。

PyQt依赖于Qt本身的C ++代码,这意味着用户不仅要安装PyQt,而且还要安装所有的Qt。这个操作没有之前的安装那么简单,但是Qt和PyQt团队已经尽可能简化安装操作了,就现在来看,只要是会安装浏览器或游戏的用户,都可以通过链接成功安装Qt,如果用户十分擅长,用户甚至可以将安装脚本作为自己的安装程序的一部分。

在Linux,BSD和Ilumos中,安装程序通常由经销商的软件包管理员为用户编写。

在Linux和Windows上,wxPython的安装过程非常简单,但在Mac OS上是有问题的。如果可下载的软件包严重过时,Mac OS不利于向后兼容。由于存在修复程序的错误代码,程序包没有被更新,所以用户自己找到并实现修补程序的机会很低。现在的解决方案是打包wxPython并将其分发给Mac OS用户,或者依靠外部程序包管理器。

部件和功能

PyQt和wxPython都具有用户期望从GUI工具包(包括按钮,复选框,下拉菜单等)中获得的所有常用小部件。 两者都支持拖放操作,标签式界面,对话框和创建自定义小部件。

PyQt具有灵活性的优点。 您可以在运行时重新排列,浮动,关闭和还原Qt面板,为每个应用程序提供高度可配置的以可用性为中心的界面。

只要您使用正确的小部件,就可以为用户提供很多友好的功能,而不必自己去重新思考花哨的技巧。

WxPython具有很多很好的功能,但它在灵活性和用户控制方面不能和PyQt相提并论,PyQt更易于开发人员设计和布局,在开发Qt之前,要先花费一些时间从用户获取跟踪自定义布局的方法,或者如何找到意外关闭的丢失面板等等。而对于wxPython来说,想要重新打开因意外关闭的面板则是件困难的事情。

总体来说,wxPython毕竟只是wxWidgets的前端,所以如果你真的需要一个功能,你可以用C ++实现它,然后在wxPython中使用它。与PyQt相比,wxPython的学习曲线更加陡峭一些。

通信

GUI应用程序由许多较小的视觉元素组成,通常称为“小部件”。 为了使GUI应用程序顺利运行,小部件必须彼此通信,例如,用于显示图像的窗格可以知道用户选择了哪个缩略图。大多数GUI工具包,包括wxPython,都可以处理和“callback”的内部通信。 回调是指向某段代码(“函数”)的指针。如果您想要点击某个按钮小部件时发生某些事情,那么你就要为这个发生的操作编写函数,当点击按钮时,触发函数,发生操作。

如果它和Lambda表达式结合起来将会产生一个非常灵活的解决方案,达到的效果可能会超过你的预期。

另一方面,Qt以信号/槽机制而闻名。如果您将wxPython的内部通信网络比喻为旧式电话交换机,那么PyQt的通信则可以视为网状网络。

▲在Qt的信号和槽

Qt使用了信号和槽来代替回调函数。当一个特定的事件发生时,信号会被发送出去。Qt的窗体部件(widget)拥有众多预先定义好的信号,当然,我们也可以创建窗体部件(widget)的子类来为它们添加我们需要的自定义信号。槽,则是对一个特定的信号进行的反馈。Qt的窗体部件(widget)同样拥有众多预先定义好的槽,但是通常的做法是,创建窗体部件(widget)的子类并添加自定义槽,以便对感兴趣的信号进行处理。

信号和槽机制是类型安全的(type-safe):一个信号的参数必须和接收槽的参数匹配。由于这种参数匹配机制,编译器以帮助我们检查类型不匹配的签名。信号与槽是松耦合(loosely coupled)的:一个发出信号的类既不知道也不关心哪一个槽接收到这个信号。Qt的信号和槽机制保证了如果你将一个信号连接到一个槽上,槽会在正确的时间以号的参数被调用。信号与槽可以携带任意个、任意类型的参数。他们是完全的类型安全。

所有从QObject或者它的一个子类(比如:QWidget)继承的类都可以使用号与槽。对象中以这种方式通信:一个对象的状态发生了改变并发送信号,关心这个改变的另一对像接收到这个信号。发送信号的对象并不知道也不感兴趣什么对象接收它所发出的信号,这是真正的信息封装,保证了对象能被当作软件组件来使用。

槽能被用来接收信号,除此之外它们也是普通的成员函数。槽不知道是否有信号与它连接起来,正如对象不知道它发出信号是否会被接收一样。这样的机制确保了可以使用Qt创建一个个完全独立的组件。

信号可以与槽进行多对多的连接。就这样,信号与插槽建立了强大的组件编程机制。

布局

编写一个GUI应用程序,首先要做的就是设计布局,以便将所有窗口小部件都合适的布局在应用程序窗口中。和设计网页一样,你可以调整应用程序的大小,甚至可以将其设置为固定大小。

在Qt中,布局是十分顺利的进行,小部件被明确命名(QPushButton,QDial,QCheckbox,QLabel,甚至QCalendarWidget),并且易于调用,甚至连应用文档也很齐全。

这里大多数的困惑都集中在基础级的GUI元素中。 例如,如果您正在编写应用程序,您是否能从QMainWindow或QWidget开始构建您的父窗口?

QWidget是一个空的容器,能被所有其他小部件使用,当然也能放置更多的QWidget来形成放置更多小部件的父窗口。QMainWindow使用QWidget,增加了大多数应用程序需要的许多便利功能,如顶部的工具栏,底部的状态栏等。

▲QMainWindow

这是一个使用QMainWindow的小型文本编辑器,只有100多行Python代码:

wxPython中的基础小部件是wx.Window。 wxPython中的所有内容都是基于wx.Window类的,无论是实际的窗口还是按钮,复选框或文本标签。如果类名写错了,wx.Window将直接忽略。

下图是使用wx.Frame创建一个空的窗口:

将其他小部件放在wx.Frame窗口中,然后构建GUI应用程序。 例如,wx.Panel小部件类似于具有绝对大小约束的HTML中的div,因此您可以使用它在主窗口中创建面板。

与PyQt相比,WxPython具有较少的便捷功能。 例如,复制和粘贴功能是建立在PyQt中的,而在wxPython中必须手工编码(并且有部分还受其运行的平台的限制)。

▲WxPython框架

wxPython中的简单文本编辑器:

你应该使用哪一个呢?

PyQt和wxPython GUI工具包都有自己的优势。

WxPython在大多数情况下的应用都是比较简单的,即使在使用过程中出现一些难题,对于Python程序员来说也是很直观、易于解决的。你不必学习太多的“wxWidget way”实例,它可以将零七碎八的工具包放置在GUI中,如果你定位的用户空间已安装GTK,那么wxPython会以最小的依赖关系轻轻松开。

WxPython使用原生小部件使得开发的应用程序与计算机上的应用程序几乎没有不同。另外,对于wxPython的跨平台不要期待太高,它有时会在某些平台上出现安装问题,因为它没有提供多层抽象来屏蔽平台之间的差异。

PyQt比较大,总是需要安装一些依赖关系(特别是在非Linux和非BSD中)。沉重的代码也带来了很多便利性,Qt几乎可以完全支持跨平台,同时也提供了很多预置的功能和部件,这对于依靠Qt作为基础框架的公司和一些开源项目来说都是非常重要的。

至于WxPython和PyQt到底要选择哪个,其实是没有定论的,首先你要看它们的哪些点吸引或者说是吸引了你,其次如果你是一个成熟的程序员,你要可以选择自己更擅长的,最重要的要根据项目的实际需求来进行选择。

相关推荐

SQL关联各种JOIN傻傻分不清楚,读这一篇就够了

在关系型数据库中支持多表关联,不同场景下通过不同join方式让分布在不同表中的数据呈现在同一个结果里。熟练使用sql联合查询是日常开发的基础工作。为了方便演示讲解,假设有两个表,一张是保存学生踢足球的...

MyBatis的SQL执行流程不清楚?看完这一篇就够了

推荐学习真香警告!Alibaba珍藏版mybatis手写文档,刷起来全网独家的“MySQL高级知识”集合,骨灰级收藏,手慢则无前言MyBatis可能很多人都一直在用,但是MyBatis的SQL执行...

SQL优化这十条,面试的时候你都答对了吗?

尽量不要在要给在SQL语句的where子句中使用函数,这样会使索引失效。如果已经确定查询结果只有一条数据(当表中数据的该字段是唯一的),在查询SQL末尾增加limit1,这样MySQL的查询执行引...

SQL查询Excel结果数据还可这样输出到窗体控件ListBox和ListView

上一期作品,我们分享了通过SQL查询Excel的结果数据输出到Excel自身的工作表区域。大家估计应该感觉到了SQL查询的强大功能,它对精确或模糊查询均无畏惧,优点是查询检索效率高,将查询结果输出的形...

数据库|SQLServer数据库:模糊查询的三种情况

哈喽,你好啊,我是雷工!就是字面意思,当数据库的查询条件并不是十分具体时就用到模糊查询,比如查询姓氏为雷的人名,就需要从姓名列模糊查询。01like关键字查询当使用like关键字进行查询时,字段中的...

数据库教程-SQL Server多条件模糊查询

表单查询是以数据存储管理为基础的信息管理系统各业务功能实现的基础,也是数据库CRUD操作的重点与难点,尤其是多表连接查询、条件查询、分组查询、聚合函数等的综合应用。本文以某一比赛样式要求为基础,对数据...

如何利用教育网站源码成功搭建在线教育网站

如今是一个信息化时代,人们都想接受各种各样的教育,在线教育也就因此发展了起来,并且逐渐成为了一种趋势。而成熟的在线教育网站皆是由高质量的教育网站源码搭建而成的。如何利用教育网站源码成功搭建在线教育网站...

宝塔搭建WordPress跨境电商外贸商城模板汉化woodmart7.5.1源码

大家好啊,欢迎来到web测评。本期给大家带来一套php开发的WoodmartV7.5.1汉化主题|跨境电商|外贸商城|产品展示网站模板WordPress主题,是wordpress开发的。上次是谁要的系...

小狐狸ChatGPT付费创作系统V2.4.7全开源版 (vue全开源端)

测试环境:Nginx1.20+PHP7.4+MySQL5.7本版本为官方的最新开源包对应V2.4.7版本,包含了前后端所有开源包,是目前最新全开源版本,需要二开的这部分朋友也有选择了,如果不需要二...

php宝塔搭建部署thinkphp红色大气装修公司官网php源码

大家好啊,欢迎来到web测评。本期给大家带来一套php开发的thinkphp红色大气装修公司官网源码,上次是谁要的系统项目啊,帮你找到了,还说不会搭建,让我帮忙录制一期教程,趁着今天有空,简单的录制测...

php宝塔搭建免登录积分商城系统php源码

大家好啊,欢迎来到web测评。本期给大家带来一套php开发的免登录积分商城系统php源码,上次是谁要的系统项目啊,帮你找到了,还说不会搭建,让我帮忙录制一期教程,趁着今天有空,简单的录制测试了一下,部...

零代码搭建接口收费平台——接口大师YesApi

主流的API接口收费模式目前各大API接口平台,采用的收费模式主可以分为:免费接口、免费试用、接口流量套餐、先充值后按量计费的模式。例如,聚合数据的API收费模式是:按接口流量套餐。例如身份证二要素...

php宝塔搭建部署实战抽奖系统开源php源码

大家好啊,我是测评君,欢迎来到web测评。本期给大家带来一套抽奖系统开源php源码。感兴趣的朋友可以自行下载学习。技术架构PHP5.4+nginx+mysql5.7+JS+CSS+...

【推荐】一款开源个人与企业私有化部署使用的在线知识库管理平台

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍zyplayer-doc是一款基于Java+Vue开源、专注于个人与企业私有化部署使用的在线知识库管...

网上的付费文档无法下载?这几个方法10秒搞定,任意免费复制

工作或者学习过程中,我们很多时候需要在网上找资料,但是想要的资料却要付费或者提示无法下载怎么办?别怕,这几个方法,让你10秒就能搞定付费文档,任意复制。1.打印界面复制遇到文档需要付费或者无法复制的...