Python图形界面框架PySide6使用及避坑指南_第1页
Python图形界面框架PySide6使用及避坑指南_第2页
Python图形界面框架PySide6使用及避坑指南_第3页
Python图形界面框架PySide6使用及避坑指南_第4页
Python图形界面框架PySide6使用及避坑指南_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python图形界⾯框架PySide6使⽤及避坑指南使⽤Python开发图形界⾯的软件其实并不多,相对于GUI界⾯,可能Web⽅式的应⽤更受⼈欢迎。但基于GUI做⼀些⼩⼯具,还是很实⽤的。在界⾯⼯具中,PySide6功能强⼤,与Pycharm相结合,可以满⾜各种变态与正常的需求。PySide6的界⾯⽬前为两种,⼀种是传统的QTWidgets,另⼀种是相对新颖的QML。本⽂演⽰了PySide6的安装、配置、以天⽓预报⽰例演⽰了开发流程,对期间碰到的问题进⾏了梳理和总结。环境信息是:Win10、PyCharm2020.1、PySide6、PyInstaller4.8、Python3.7,基于QTWidgets设置图形界⾯。安装PySide6安装PySide6Qt是⼀个跨平台的C++图形界⾯应⽤程序框架。它提供给开发者建⽴图形⽤户界⾯所需的功能,⼴泛⽤于开发GUI程序,也可⽤于开发⾮GUI程序。Qt很容易扩展,并且允许真正地组件编程。基本上,Qt同XWindow上的Motif,Openwin,GTK等图形界⾯库以及Windows平台上的MFC、OWL、VCL、ATL是同类型的东西。PySide6是⾃于QtforPython项⽬的官⽅Python模块QtDesigner拖拽式的界⾯设计⼯具:通过拖拽的⽅式放置控件,并实时查看控件效果进⾏快速UI设计PyUIC:主要是把QtDesigner⽣成的.ui⽂件换成.py⽂件PyRCC主要是把编写的.qrc资源⽂件换成.py⽂件,它提供了对完整Qt6.0+框架的访问。pipinstallPySide6安装的是最新版:,已经包含了QtDesigner、PyUIC、PyRCC⼯具PyCharm中配置ExternalTools在PyCharm中的ExternalTools中,配置下图的三个⼯具。配置QtDesignerName:QtDesignerProgram:D:\program\Anaconda3\Scripts\pyside6-designer.exe#请根据实际修改Workingdirectory:$ProjectFileDir$配置PyUICName:PyUICProgram:D:\program\Anaconda3\Scripts\pyside6-uic.exe#请根据实际修改Arguments:$FileName$-o$FileNameWithoutExtension$.pyWorkingdirectory:$FileDir$配置PyRCCName:PyRCCProgram:D:\program\Anaconda3\Scripts\pyside6-rcc.exe#请根据实际修改Arguments:$FileName$-o$FileNameWithoutExtension$_rc.pyWorkingdirectory:$FileDir$使⽤⽰例使⽤PySide6开发⼀个天⽓预报查询页⾯,通过选择⼴东不同的地市,查询不同地市的天⽓预报信息。代码结构如下:使⽤QtDesigner进⾏界⾯设计整个画⾯的构成:左侧的“WidgetBox”就是各种可以⾃由拖动的组件中间的“MainWindow–weather.ui”窗体就是画布右上⽅的”ObjectInspector”可以查看当前ui的结构右侧中部的”PropertyEditor”可以设置当前选中组件的属性右下⽅的”ResourceBrowser”可以添加各种素材,⽐如图⽚,背景等等最终⽣成.ui⽂件(实质上是XML格式的⽂件),可直接使⽤,也可以通过PyUIC⼯具转换成.py⽂件。本⽰例⽤到的控件有Button,GroupBox,Label,ComboBox,TextEdit,同时定义了两个按钮searchBtn及clearBtn,分别⽤来查询及清空天⽓数据:针对按钮设置信号/槽,也可以不设置,⽣成python代码后在代码中添加。在QtDesigner右下⾓选择信号/槽编辑器,点击+号新增分别选择searchBtn及clearBtn,选择信号clicked(),接收者QtWeather及槽【内置了⼀些常⽤的槽函数,如close,repaint,hide】,(槽函数这⾥不知道如何定义,后期在代码⾥再进⾏修改)设置完成后,保存为weather.ui⽂件。转换.ui⽂件为.py⽂件为了更好的⾃定义及修改上⾯的槽函数,可以选择weather.ui,然后右键打开ExternalTools–PyUIC,即可⽣成weather.py,实际运⾏命令如下:D:\program\Anaconda3\Scripts\pyside6-uic.exeweather.ui-oweather.py绑定槽函数设置两个按钮绑定的槽函数self.seachBtn.clicked.connect(QtWeather.queryWeather)self.clearBtn.clicked.connect(QtWeather.clearText)设置下拉列表内容详见weather.py代码将selectBox下拉列表选择设置为⼴东的21个地市,并且默认选择第三个。#-*-coding:utf-8-*-##################################################################################################################################################################FormgeneratedfromreadingUIfile'weather.ui'##Createdby:QtUserInterfaceCompilerversion6.2.2##WARNING!AllchangesmadeinthisfilewillbelostwhenrecompilingUIfile!################################################################################fromPySide6.QtCoreimport(QCoreApplication,QMetaObject,QRect,)QtfromPySide6.QtWidgetsimport(QComboBox,QGroupBox,QLabel,,QPuQMenuBarshButton,QStatusBar,QTextEdit,QWidget)classUi_QtWeather(object):defsetupUi(self,QtWeather):ifnotQtWeather.objectName():QtWeather.setObjectName(u"QtWeather")QtWeather.setWindowModality(Qt.ApplicationModal).resize(360,398)QtWeather.scelfntralwidget=QWidget(QtWeather).scelfntralwidget.setObjectName(u"centralwidget").selfgroupBox=QGroupBox(self.centralwidget).selfgroupBox.setObjectName(u"groupBox").selfgroupBox.setGeometry(QRect(20,20,321,301)).selfcityLabel=QLabel(self.groupBox).selfcityLabel.setObjectName(u"cityLabel").selfcityLabel.setGeometry(QRect(20,30,31,16)).selfectBox=QComboBox(self.groupBox).selfectBox.setObjectName(u"selectBox").selfectBox.setGeometry(QRect(60,30,231,22)).selfectBox.setEditable(True).stelfxtEdit=QTextEdit(self.groupBox).stelfxtEdit.setObjectName(u"textEdit").stelfxtEdit.setGeometry(QRect(20,70,271,211)).selfclearBtn=QPushButton(self.centralwidget).selfclearBtn.setObjectName(u"clearBtn").selfclearBtn.setGeometry(QRect(30,330,75,24)).selfachBtn=QPushButton(self.centralwidget).selfachBtn.setObjectName(u"seachBtn").selfachBtn.setGeometry(QRect(270,330,75,24))QtWeather.setCentralWidget(self.centralwidget).smelfnubar=QMenuBar(QtWeather).smelfnubar.setObjectName(u"menubar").smelfnubar.setGeometry(QRect(0,0,360,22))QtWeather.setMenuBar(self.menubar).selftatusbar=QStatusBar(QtWeather).selftatusbar.setObjectName(u"statusbar")QtWeather.setStatusBar(self.statusbar).srelftranslateUi(QtWeather).selfachBtn.clicked.connect(QtWeather.queryWeather).selfclearBtn.clicked.connect(QtWeather.clearText)QMetaObject.connectSlotsByName(QtWeather)#setupUidefretranslateUi(self,QtWeather):_translate=QCoreApplication.translateQtWeather.setWindowTitle(_translate("QtWeather",u"MainWindow",None)).selfgroupBox.setTitle(_translate("QtWeather",u"城市天⽓预报",None)).selfcityLabel.setText(_translate("QtWeather",u"城市",None)).selfclearBtn.setText(_translate("QtWeather",u"清空",None)).selfachBtn.setText(_translate("QtWeather",u"查询",None)).selfectBox.addItem("⼴州").selfectBox.addItem("韶关").selfectBox.addItem("深圳").selfectBox.addItem("珠海").selfectBox.addItem("汕头").selfectBox.addItem("汕头").selfectBox.addItem("佛⼭").selfectBox.addItem("江门").selfectBox.addItem("湛江").selfectBox.addItem("茂名").selfectBox.addItem("肇庆").selfectBox.addItem("惠州").selfectBox.addItem("梅州").selfectBox.addItem("汕尾").selfectBox.addItem("河源").selfectBox.addItem("阳江").selfectBox.addItem("清远").selfectBox.addItem("东莞").selfectBox.addItem("中⼭").selfectBox.addItem("潮州").selfectBox.addItem("揭阳").selfectBox.addItem("云浮")#设置默认值.selfectBox.setCurrentIndex(3).selfectBox.currentText()#retranslateUi编写应⽤业务逻辑在MainWindow中调⽤界⾯类Ui_QtWeather,然后在其中添加查询天⽓的业务逻辑代码,这样就做到了界⾯显⽰和业务逻辑的分离。新增myapp.py⽂件,在MainWindow类中定义两个槽函数queryWeather()和clearText(),以便在界⾯⽂件weather.ui中定义的两个按钮(searchBtn和clearBtn)触发clicked信号与这两个槽函数进⾏绑定。Application组件讲解:QApplication():每个GUI都必须包含⼀个QApplication,argv表⽰获取命令⾏参数。QMainWindow():类似⼀个容器(窗⼝)QMainWindow类提供⼀个带有菜单条,⼯具条和⼀个状态条的主应⽤程序窗⼝。主窗⼝通常提供⼀个⼤的中央窗⼝部件,以及周围菜单,⼯具条,和⼀个状态栏。⽤来包含按钮、⽂⼊框等widgets。arg标识可以获取命令⾏执⾏时的参数。setGeometry是⽤来定义MainWindow()窗⼝的⼨,语法:setGeometry(x,y,width,height),其中x,y为屏幕上的坐标点。show():⽤来显⽰窗⼝exit(app.exec()):设置窗⼝⼀直运⾏,直到使⽤关闭按钮进⾏关闭QWidget类是所有⽤户界⾯对象的基类,窗⼝部件是⽤户界⾯的⼀个基本单元,它从窗⼝系统接收⿏标,键盘和其他消息,并在屏幕上绘制⾃⼰。⼀个窗⼝部件可以被他的⽗窗⼝或者是其他窗⼝挡住⼀部分。QDialog类是对话框窗⼝的基类,对话框窗⼝主要⽤于短期任务和⽤户进⾏短期通讯的顶级窗⼝,QDialog可以是模态对话框或者⾮模态对话框。QDialog⽀持扩展并带有返回值,他们可以带有默认值importsysimportrequestsfromPySide6.QtWidgetsimportQApplication,QMainWindowfromweatherimportUi_QtWeatherclassMainWindow(QMainWindow):def__init__(self):super().__init__().selfui=Ui_QtWeather().selfui.setupUi(self).selfcityDict={"⼴州":"440100","韶关":"440200","深圳":"440300","珠海":"440400","珠海":"440400","汕头":"440500","佛⼭":"440600","江门":"440700","湛江":"440800","茂名":"440900","肇庆":"441200","惠州":"441300","梅州":"441400","汕尾":"441500","河源":"441600","阳江":"441700","清远":"441800","东莞":"441900","中⼭":"442000","潮州":"445100","揭阳":"445200","云浮":"445300"}defqueryWeather(self):cityName=self.ui.selectBox.currentText()=self.getCode(cityName)cityCode=requests.get("/v3/weather/weatherInfo?key=f4fd5b287b6d7d51a3c60fee24e42002&city={}".format(cityCode))ifr.status_code==200:=datar.json()['lives'][0]weatherMsg='城市:{}\n天⽓:{}\n温度:{}\n风向:{}\n风⼒:{}\n湿度:{}\n发布时间:{}\n'.format(['cidataty'],['wedataather'],['tedatamperature'],['widatanddirection'],['widatandpower'],['hudatamidity'],['redataporttime'],)else:weatherMsg='天⽓查询失败,请稍后再试!'.selfui.textEdit.setText(weatherMsg)defgetCode(self,cityName):returnself.cityDict.get(cityName,'⼴州')defclearText(self):.selfui.textEdit.clear()if__name__=='__main__':app=QApplication(sys.argv)window=MainWindow()window.setGeometry(150,150,360,398)window.setWindowTitle("QT简单⽰例教程")window.show()sys.exit(app.exec())运⾏效果将代码打包成exe⽂件将.py⽂件打包成可执⾏的exe在Python中称为freezing,常⽤的⼯具有:PyInstaller,py2exe,fbs等。py2exe:软件更新已经不活跃,因此也就略过。pyinstaller:明确⽀持win8、win10、理论上⽀持win7,,⽀持appleMacos,linux。pyinsaller可以打包成⽂件夹形式内含exe⼊⼝执⾏⽂件的形式,也可以是⼀个单独的exe⽂件。fbs:基于PyInstaller,使⽤起来更加⽅便,但开源版本只⽀持python3.6/3.7本⽂使⽤打包打包后会在项⽬⽬录下⽣成dist/myapp⽬录,在此⽬录中包含⼀个myapp.exe⽂件,点击可运⾏。#安装,版本是4.8pipinstallpyinstaller#打包pyinstaller\pE:ycodes\qt-test\myapp.py附录错误解决PyCharm中运⾏报Qtplatformplugincouldbeinitialized运⾏myapp.py时,报错:ThisapplicationfailedtostartbecausenotQtplatformplugincouldbeinitialized.Reinstallingtheapplicationmayfixthisproblem.解决⽅案有如下2种:设置环境变量:QT_QPA_PLATFORM_PLUGIN_PATH=D:\program\Anaconda3\Lib\site-packages\PySide6\plugins\platforms在程序初始部分添加如下代码:dirname=os.path.dirname(PySide6.__file__)plugin_path=os.path.join(dirname,'plugins','platforms')print(plugin_path)os.environ['QT_QPA_PLATFORM_PLUGIN_PATH']=plugin_pathPySide6程序打包后⽆法运⾏noQtplatformplugincouldbeinitia

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论