找回密码
 会员注册
查看: 26|回复: 0

Python一文读懂PyQt:如何用Python快速做出GUI桌面应用程序

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
71056
发表于 2024-9-5 20:34:21 | 显示全部楼层 |阅读模式
本文从安装配置开始,详细介绍了如何使用PyQt进行GUI桌面应用程序开发。我们逐步讲解了PyQt的基础概念,包括核心模块和主要类,并通过实际示例展示了基本控件的创建和使用、窗口布局管理、信号与槽机制、以及事件处理。此外,还探讨了自定义控件和多线程的高级主题。最终,通过实现一个简单的计算器项目,综合运用了所学知识,展示了PyQt强大的功能和灵活性。通过本教程,你应该掌握了使用PyQt创建和管理GUI应用的基本技巧。PyQt功能强大,继续深入学习和实践将帮助你更熟练地开发高效、美观的桌面应用程序。希望本文能为你的PyQt学习旅程提供坚实的基础,助你在GUI开发中游刃有余,创造出更多优秀的应用。Happycoding!🧑博主简介:现任阿里巴巴嵌入式技术专家,15年工作经验,深耕嵌入式+人工智能领域,精通嵌入式领域开发、技术管理、简历招聘面试。CSDN优质创作者,提供产品测评、学习辅导、简历面试辅导、毕设辅导、项目开发、C/C++/Java/Python/Linux/AI等方面的服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:gylzbk)💬博主粉丝群介绍:①群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。②热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。一文带你读懂PyQt:如何用Python快速做出GUI桌面应用程序引言1.PyQt简介什么是PyQt?PyQt的优势2.环境搭建安装Python安装PyQt3.PyQt基础概念python基础教程Qt库的核心模块PyQt中的主要类4.创建第一个PyQt应用代码讲解:运行代码5.窗口与控件创建主窗口运行代码添加按钮运行代码更多控件运行代码6.布局管理垂直布局运行代码水平布局运行代码网格布局运行代码7.信号与槽机制什么是信号与槽?使用信号与槽运行代码自定义信号与槽运行代码8.事件处理事件与事件处理常见事件处理方法运行代码9.高级主题:自定义控件与多线程自定义控件运行代码多线程运行代码10.项目实例:创建一个简单的计算器项目背景项目结构完整代码代码讲解运行代码11.总结引言如果你想使用Python快速构建图形用户界面(GUI)桌面应用程序,PyQt是一个强大且灵活的选择。PyQt是一组Python绑定,基于流行的Qt应用程序框架。无论是对GUI开发完全陌生,还是有一定编程基础的读者,本文都将带你一步一步地深入了解PyQt的核心内容,帮助你快速掌握使用PyQt进行桌面应用开发。1.PyQt简介什么是PyQt?PyQt是由RiverbankComputing公司开发的一组Python插件,它将Qt应用程序框架的功能暴露给Python。Qt是一个跨平台的C++库,用于开发图形用户界面和多平台应用程序。PyQt的优势跨平台:支持Windows、macOS、Linux等多个操作系统。强大的控件集:提供了丰富的GUI控件,满足常见和复杂的UI需求。全面的文档:官网文档详尽,支持社区活跃。高度可扩展:支持自定义控件与信号槽机制,功能强大。2.环境搭建安装Python确保你已安装Python3.5或更高版本。可以从Python官方网站下载最新版本的Python。Python安装教程可以参考我的另一篇保姆级博文:《【Python】Python下载安装新手教程:适用于Windows、macOS和Linux多平台的python环境搭建保姆级全攻略》。安装PyQt可以使用pip来安装PyQt5和相关工具包:pipinstallPyQt5PyQt5-tools1如果安装过程中有如下错误:Usingcachedcolorama-0.4.6-py2.py3-none-any.whl(25kB)Usingcachedimportlib_metadata-6.7.0-py3-none-any.whl(22kB)Usingcachedqt5_applications-5.15.2.2.3-py3-none-win_amd64.whl(64.5MB)Usingcachedtyping_extensions-4.7.1-py3-none-any.whl(33kB)Usingcachedzipp-3.15.0-py3-none-any.whl(6.8kB)BuildingwheelsforcollectedpackagesyQt5-sipBuildingwheelforPyQt5-sip(pyproject.toml):startedBuildingwheelforPyQt5-sip(pyproject.toml):finishedwithstatus'error'error:subprocess-exited-with-errorBuildingwheelforPyQt5-sip(pyproject.toml)didnotrunsuccessfully.exitcode:1[5linesofoutput]runningbdist_wheelrunningbuildrunningbuild_extbuilding'PyQt5.sip'extensionerror:MicrosoftVisualC++14.0orgreaterisrequired.Getitwith"MicrosoftC++BuildTools":https://visualstudio.microsoft.com/visual-cpp-build-tools/[endofoutput]note:Thiserrororiginatesfromasubprocess,andislikelynotaproblemwithpip.ERROR:FailedbuildingwheelforPyQt5-sipFailedtobuildPyQt5-sipERROR:CouldnotbuildwheelsforPyQt5-sip,whichisrequiredtoinstallpyproject.toml-basedprojects1234567891011121314151617181920212223242526Windows平台安装过程中遇到这个错误,说明需要用到MicrosoftC++BuildTools。大概步骤如下:访问微软开发工具官方下载网站:https://visualstudio.microsoft.com/visual-cpp-build-tools/点击下载生成工具按钮,下载安装包。安装包只是个壳,很快就可以下载完成。运行安装包,如下图所示,点击继续按钮,进入安装界面之后,选择使用C++的桌面开发,然后点击右下角的安装,直至安装完成即可。重新执行pyqt安装命令,即可安装成功。pipinstallPyQt5PyQt5-tools1下载安装MicrosoftC++BuildTools,需要很长的时间,另外需要下载大量的文件,耗时费力。如果你不想那么费事,还可以手动下载whl文件,手动安装,以跳过这个错误,方法如下:下载whl文件whl下载地址:https://pypi.tuna.tsinghua.edu.cn/simple/pyqt5-sip/。比如我是Win1064位(对应win_amd64)系统,python版本为3.7.0(对应cp37),所以我选择了适配与我的系统和python版本的PyQt5_sip最新版本whl文件:PyQt5_sip-12.12.2-cp37-cp37m-win_amd64.whl。whl文件下载后使用pipinstallPyQt5_sip-12.12.2-cp37-cp37m-win_amd64.whl命令安装它。最后,重新执行pyqt安装命令,如下图所示,即可安装成功。pipinstallPyQt5PyQt5-tools13.PyQt基础概念python基础教程本文阅读需要一定的Python基础,可以参考我另外一篇博文进行学习:《【Python】全网最详细最完整的Python基础教程,Python入门教程(索引篇)》。Qt库的核心模块QtWidgets:包含了所有的重要GUI类。QtCore:包含了非GUI功能,如事件循环与信号槽机制。QtGui:包含了图形和字体相关的类。PyQt中的主要类QApplication:管理GUI应用程序的控制流和主设置。QWidget:所有用户界面对象的基类。QMainWindow:创建主窗口。QPushButton:按钮控件。QLabel:标签控件。QLineEdit:单行文本输入框。QVBoxLayout/QHBoxLayout:垂直/水平布局管理器。4.创建第一个PyQt应用让我们从一个简单的"Hello,World!"应用程序开始。创建一个Python文件,例如hello.py。编写以下代码:importsysfromPyQt5.QtWidgetsimportQApplication,QLabel,QWidgetdefmain():app=QApplication(sys.argv)mainWindow=QWidget()mainWindow.setWindowTitle('Hello,World!')mainWindow.setGeometry(100,100,280,80)label=QLabel(' Hello,World! ',parent=mainWindow)label.move(60,15)mainWindow.show()sys.exit(app.exec_())if__name__=='__main__':main()1234567891011121314151617代码讲解:QApplication:创建应用对象。QWidget:创建主窗口。QLabel:在窗口上显示文本。setGeometry:设置窗口的位置和大小。show:展示窗口。sys.exit:确保应用程序干净退出。运行代码在命令行或终端中运行:pythonhello.py1你将看到一个为"Hello,World!"的窗口。5.窗口与控件创建主窗口使用QMainWindow来创建主窗口,可以添加菜单栏、工具栏等。创建一个Python文件,例如main_window.py。编写以下代码:importsysfromPyQt5.QtWidgetsimportQApplication,QMainWindowclassMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle('MainWindow')self.setGeometry(100,100,600,400)defmain():app=QApplication(sys.argv)mainWindow=MainWindow()mainWindow.show()sys.exit(app.exec_())if__name__=='__main__':main()123456789101112131415161718运行代码在命令行或终端中运行:pythonmain_window.py1你将看到一个为"MainWindow"的窗口。添加按钮继续在main_window.py文件中添加以下代码:importsysfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QPushButtonclassMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle('MainWindow')self.setGeometry(100,100,600,400)button=QPushButton('ClickMe',self)button.setGeometry(100,100,200,50)button.clicked.connect(self.on_button_click)defon_button_click(self):print('Buttonclicked!')defmain():app=QApplication(sys.argv)mainWindow=MainWindow()mainWindow.show()sys.exit(app.exec_())if__name__=='__main__':main()12345678910111213141516171819202122232425运行代码在命令行或终端中运行:pythonmain_window.py1你将看到一个带有按钮的窗口,点击按钮会在控制台输出"Buttonclicked!"。更多控件继续在main_window.py文件中添加以下代码:importsysfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QLineEdit,QTextEdit,QCheckBox,QRadioButton,QComboBox,QPushButtonclassMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle('MainWindow')self.setGeometry(100,100,600,400)lineEdit=QLineEdit(self)lineEdit.setGeometry(100,50,200,30)textEdit=QTextEdit(self)textEdit.setGeometry(100,100,200,100)checkBox=QCheckBox('Checkme',self)checkBox.setGeometry(100,220,100,30)radioButton=QRadioButton('Selectme',self)radioButton.setGeometry(100,260,100,30)comboBox=QComboBox(self)comboBox.setGeometry(100,300,200,30)comboBox.addItems(['Option1','Option2','Option3'])defmain():app=QApplication(sys.argv)mainWindow=MainWindow()mainWindow.show()sys.exit(app.exec_())if__name__=='__main__':main()12345678910111213141516171819202122232425262728293031323334运行代码在命令行或终端中运行:pythonmain_window.py1你将看到一个窗口,包含单行输入框、多行输入框、复选框、单选按钮和下拉列表框。6.布局管理垂直布局创建一个新的Python文件,例如vertical_layout.py,并编写以下代码:importsysfromPyQt5.QtWidgetsimportQApplication,QWidget,QVBoxLayout,QPushButtonclassMainWindow(QWidget):def__init__(self):super().__init__()self.setWindowTitle('VerticalLayout')self.setGeometry(100,100,400,300)layout=QVBoxLayout()layout.addWidget(QPushButton('Button1'))layout.addWidget(QPushButton('Button2'))layout.addWidget(QPushButton('Button3'))self.setLayout(layout)defmain():app=QApplication(sys.argv)mainWindow=MainWindow()mainWindow.show()sys.exit(app.exec_())if__name__=='__main__':main()1234567891011121314151617181920212223242526运行代码在命令行或终端中运行:pythonvertical_layout.py1你将看到一个窗口,按钮垂直排列。水平布局创建一个新的Python文件,例如horizontal_layout.py,并编写以下代码:importsysfromPyQt5.QtWidgetsimportQApplication,QWidget,QHBoxLayout,QPushButtonclassMainWindow(QWidget):def__init__(self):super().__init__()self.setWindowTitle('HorizontalLayout')self.setGeometry(100,100,400,300)layout=QHBoxLayout()layout.addWidget(QPushButton('Button1'))layout.addWidget(QPushButton('Button2'))layout.addWidget(QPushButton('Button3'))self.setLayout(layout)defmain():app=QApplication(sys.argv)mainWindow=MainWindow()mainWindow.show()sys.exit(app.exec_())if__name__=='__main__':main()1234567891011121314151617181920212223242526运行代码在命令行或终端中运行:pythonhorizontal_layout.py1你将看到一个窗口,按钮水平排列。网格布局创建一个新的Python文件,例如grid_layout.py,并编写以下代码:importsysfromPyQt5.QtWidgetsimportQApplication,QWidget,QGridLayout,QPushButtonclassMainWindow(QWidget):def__init__(self):super().__init__()self.setWindowTitle('GridLayout')self.setGeometry(100,100,400,300)layout=QGridLayout()layout.addWidget(QPushButton('Button1'),0,0)layout.addWidget(QPushButton('Button2'),0,1)layout.addWidget(QPushButton('Button3'),1,0)layout.addWidget(QPushButton('Button4'),1,1)self.setLayout(layout)defmain():app=QApplication(sys.argv)mainWindow=MainWindow()mainWindow.show()sys.exit(app.exec_())if__name__=='__main__':main()123456789101112131415161718192021222324252627运行代码在命令行或终端中运行:pythongrid_layout.py1你将看到一个窗口,按钮网格排列。7.信号与槽机制什么是信号与槽?信号与槽机制是Qt的重要特性之一,用于对象间通信。信号是某个事件发生的反馈,槽是响应信号的函数。使用信号与槽创建一个新的Python文件,例如signals_slots.py,并编写以下代码:importsysfromPyQt5.QtWidgetsimportQApplication,QWidget,QPushButtonclassMainWindow(QWidget):def__init__(self):super().__init__()self.setWindowTitle('SignalsandSlots')self.setGeometry(100,100,400,300)button=QPushButton('ClickMe',self)button.setGeometry(150,130,100,50)button.clicked.connect(self.on_button_click)defon_button_click(self):print('Buttonclicked!')defmain():app=QApplication(sys.argv)mainWindow=MainWindow()mainWindow.show()sys.exit(app.exec_())if__name__=='__main__':main()12345678910111213141516171819202122232425运行代码在命令行或终端中运行:pythonsignals_slots.py1你将看到一个带有按钮的窗口,点击按钮会在控制台输出"Buttonclicked!"。自定义信号与槽创建一个新的Python文件,例如custom_signals_slots.py,并编写以下代码:importsysfromPyQt5.QtCoreimportpyqtSignal,QObjectfromPyQt5.QtWidgetsimportQApplication,QWidget,QPushButtonclassCommunicate(QObject):signal=pyqtSignal()classMainWindow(QWidget):def__init__(self):super().__init__()self.setWindowTitle('CustomSignalsandSlots')self.setGeometry(100,100,400,300)self.comm=Communicate()self.comm.signal.connect(self.on_custom_signal)button=QPushButton('EmitSignal',self)button.setGeometry(150,130,100,50)button.clicked.connect(self.comm.signal.emit)defon_custom_signal(self):print('Customsignalemitted!')defmain():app=QApplication(sys.argv)mainWindow=MainWindow()mainWindow.show()sys.exit(app.exec_())if__name__=='__main__':main()1234567891011121314151617181920212223242526272829303132运行代码在命令行或终端中运行:pythoncustom_signals_slots.py1你将看到一个带有按钮的窗口,点击按钮会在控制台输出"Customsignalemitted!"。8.事件处理事件与事件处理事件处理机制用于响应用户的输入、窗口状态变化等事件。可以重载特定事件处理方法来处理事件。常见事件处理方法创建一个新的Python文件,例如event_handling.py,并编写以下代码:importsysfromPyQt5.QtWidgetsimportQApplication,QWidgetclassMainWindow(QWidget):def__init__(self):super().__init__()self.setWindowTitle('EventHandling')self.setGeometry(100,100,400,300)defmousePressEvent(self,event):print('Mousebuttonpressed!')defkeyPressEvent(self,event):print(f'Keypressed:{event.key()}')defpaintEvent(self,event):print('Windowpainting!')defmain():app=QApplication(sys.argv)mainWindow=MainWindow()mainWindow.show()sys.exit(app.exec_())if__name__=='__main__':main()123456789101112131415161718192021222324252627运行代码在命令行或终端中运行:pythonevent_handling.py1点击窗口或按下键盘按键,可以在控制台观察事件输出。9.高级主题:自定义控件与多线程自定义控件创建一个新的Python文件,例如custom_widget.py,并编写以下代码:importsysfromPyQt5.QtWidgetsimportQApplication,QLabel,QWidgetclassCustomLabel(QLabel):def__init__(self,text,parent=None):super().__init__(text,parent)defmousePressEvent(self,event):self.setText('Labelclicked!')classMainWindow(QWidget):def__init__(self):super().__init__()self.setWindowTitle('CustomWidgets')self.setGeometry(100,100,400,300)label=CustomLabel('Clickme',self)label.setGeometry(150,130,100,50)defmain():app=QApplication(sys.argv)mainWindow=MainWindow()mainWindow.show()sys.exit(app.exec_())if__name__=='__main__':main()12345678910111213141516171819202122232425262728运行代码在命令行或终端中运行:pythoncustom_widget.py1点击Clickme标签,会看到标签文本变为Labelclicked!。多线程创建一个新的Python文件,例如multithreading.py,并编写以下代码:importsysfromPyQt5.QtCoreimportQThread,pyqtSignalfromPyQt5.QtWidgetsimportQApplication,QLabel,QWidgetclassWorkerThread(QThread):progress=pyqtSignal(int)defrun(self):foriinrange(100):self.progress.emit(i+1)self.sleep(1)classMainWindow(QWidget):def__init__(self):super().__init__()self.setWindowTitle('Multithreading')self.setGeometry(100,100,400,300)self.label=QLabel('0%',self)self.label.setGeometry(150,130,100,50)self.worker=WorkerThread()self.worker.progress.connect(self.update_label)self.worker.start()defupdate_label(self,value):self.label.setText(f'{value}%')defmain():app=QApplication(sys.argv)mainWindow=MainWindow()mainWindow.show()sys.exit(app.exec_())if__name__=='__main__':main()12345678910111213141516171819202122232425262728293031323334353637运行代码在命令行或终端中运行:pythonmultithreading.py1你将看到进度逐渐更新的效果。10.项目实例:创建一个简单的计算器项目背景我们将通过一个简单的计算器项目来综合运用上述知识点。该计算器支持基本的加减乘除运算。项目结构主窗口QMainWindow数字按钮QPushButton运算符按钮QPushButton显示屏QLineEdit布局QGridLayout完整代码创建一个Python文件,例如calculator.py,并编写以下代码:importsysfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QWidget,QPushButton,QLineEdit,QGridLayoutfromPyQt5.QtCoreimportQtclassCalculator(QMainWindow):def__init__(self):super().__init__()self.initUI()definitUI(self):self.setWindowTitle('Calculator')self.setGeometry(100,100,400,500)widget=QWidget(self)self.setCentralWidget(widget)self.display=QLineEdit()self.display.setAlignment(Qt.AlignRight)self.display.setReadOnly(True)grid=QGridLayout()widget.setLayout(grid)grid.addWidget(self.display,0,0,1,4)names=['Cls','Bck','','Close','7','8','9','/','4','5','6','*','1','2','3','-','0','.','=','+']positions=[(i,j)foriinrange(1,6)forjinrange(4)]forposition,nameinzip(positions,names):ifname=='':continuebutton=QPushButton(name)grid.addWidget(button,*position)button.clicked.connect(self.onButtonClick)defonButtonClick(self):sender=self.sender()text=sender.text()iftext=='Cls':self.display.clear()eliftext=='Bck':self.display.setText(self.display.text()[:-1])eliftext=='Close':self.close()eliftext=='=':try:result=eval(self.display.text())self.display.setText(str(result))exceptExceptionase:self.display.setText('Error')else:self.display.setText(self.display.text()+text)defmain():app=QApplication(sys.argv)calculator=Calculator()calculator.show()sys.exit(app.exec_())if__name__=='__main__':main()12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667代码讲解界面布局:我们使用QGridLayout实现计算器布局。按钮按行和列添加进网格布局。按钮功能:通过QPushButton创建按钮,并使用button.clicked.connect(self.onButtonClick)将按钮点击信号连接到onButtonClick槽函数。槽函数处理:onButtonClick函数处理不同按钮点击事件,如清除、删除、计算等。运行代码在命令行或终端中运行以下命令:pythoncalculator.py1你将看到一个计算器界面,支持基本的加减乘除运算。11.总结通过本教程,你已经了解了如何使用PyQt来创建和管理GUI桌面应用程序。我们从安装和环境配置开始,逐步讲解了PyQt的基础概念,展示了基本控件的使用、布局管理以及信号和槽机制。之后,我们探讨了事件处理、自定义控件和多线程等高级话题,最后以一个简单的计算器项目为实战例子,综合应用了这些知识。PyQt功能强大且灵活,继续深入学习和实际项目应用将帮助你更加熟练地掌握它。希望本文能为你的PyQt学习之旅打下坚实的基础。祝你在GUI开发的道路上越走越远,创造出更多优秀的桌面应用程序!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-9 04:52 , Processed in 0.450548 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表