超全!Python图形界面框架PyQt5使用指南!(2)

上一篇 / 下一篇  2022-08-09 13:08:12

  PyQt5实战
  实战项目:简易的天气查询软件
  1、使用Qt Designer设计一个界面
  用到的控件有Button, GroupBox, Label,ComboBox,TextEdit,同时定义了两个按钮queryBtn及clearBtn,分别用来查询及清空天气数据。我们需要绑定槽函数,方法如下:
  ·在Qt Designer右下角选择 信号/槽编辑器,点击+号新增
  ·  分别选择queryBtn及clearBtn,选择信号 clicked(), 接收者 Dialog 及槽 accept(),(槽函数这里不知道如何定义,后期在代码里再进行修改)
  以上完成后保存为Weather.ui文件。
  2、转换.ui文件为.py文件
  PyQt5支持直接使用.ui文件:
  import sys
  from PyQt5 import QtWidgets, uic
  app = QtWidgets.QApplication(sys.argv)
  window = uic.loadUi("mainwindow.ui")
  window.show()
  app.exec()
  但是为了更好的自定义及修改上面的槽函数,可以使用External Tools – PyUIC,即可生成Weather.py,实际运行命令如下:
  D:\Program Files\Python36\python.exe -m PyQt5.uic.pyuic Weather.ui -o Weather.py
  其中,我们需要把两个按钮绑定的槽函数:
  \# self.queryBtn.clicked.connect(Dialog.accept)
  \# self.clearBtn.clicked.connect(Dialog.accept)
  \# 修改为:
  self.queryBtn.clicked.connect(Dialog.queryWeather)
  self.clearBtn.clicked.connect(Dialog.clearText)
  最终的Weather.py内容如下:
  \# -*- coding: utf-8 -*-
  \# Form implementation generated from reading ui file 'Weather.ui'
  \#
  \# Created by: PyQt5 UI code generator 5.15.4
  \#
  \# WARNING: Any manual changes made to this file will be lost when pyuic5 is
  \# run again.  Do not edit this file unless you know what you are doing.
  from PyQt5 import QtCore, QtGui, QtWidgets
  class Ui_Dialog(object):
     def setupUi(self, Dialog):
         Dialog.setObjectName("Dialog")
         Dialog.resize(600, 600)
         self.groupBox = QtWidgets.QGroupBox(Dialog)
         self.groupBox.setGeometry(QtCore.QRect(30, 20, 551, 511))
         self.groupBox.setObjectName("groupBox")
         self.label_2 = QtWidgets.QLabel(self.groupBox)
         self.label_2.setGeometry(QtCore.QRect(20, 30, 31, 16))
         self.label_2.setObjectName("label_2")
         self.comboBox = QtWidgets.QComboBox(self.groupBox)
         self.comboBox.setGeometry(QtCore.QRect(70, 30, 87, 22))
         self.comboBox.setObjectName("comboBox")
         self.comboBox.addItem("")
         self.comboBox.addItem("")
         self.comboBox.addItem("")
         self.textEdit = QtWidgets.QTextEdit(self.groupBox)
         self.textEdit.setGeometry(QtCore.QRect(20, 70, 491, 411))
         self.textEdit.setObjectName("textEdit")
         self.queryBtn = QtWidgets.QPushButton(Dialog)
         self.queryBtn.setGeometry(QtCore.QRect(490, 560, 93, 28))
         self.queryBtn.setObjectName("queryBtn")
         self.clearBtn = QtWidgets.QPushButton(Dialog)
         self.clearBtn.setGeometry(QtCore.QRect(30, 560, 93, 28))
         self.clearBtn.setObjectName("clearBtn")
         self.retranslateUi(Dialog)
         self.clearBtn.clicked.connect(Dialog.clearText)
         self.queryBtn.clicked.connect(Dialog.queryWeather)
         QtCore.QMetaObject.connectSlotsByName(Dialog)
     def retranslateUi(self, Dialog):
         _translate = QtCore.QCoreApplication.translate
         Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
         self.groupBox.setTitle(_translate("Dialog", "城市天气预报"))
         self.label_2.setText(_translate("Dialog", "城市"))
         self.comboBox.setItemText(0, _translate("Dialog", "北京"))
         self.comboBox.setItemText(1, _translate("Dialog", "苏州"))
         self.comboBox.setItemText(2, _translate("Dialog", "上海"))
         self.queryBtn.setText(_translate("Dialog", "查询"))
         self.clearBtn.setText(_translate("Dialog", "清空"))
  3、调用MainDialog
  在MainDialog中调用界面类Ui_Dialog,然后在其中中添加查询天气的业务逻辑代码,这样就做到了界面显示和业务逻辑的分离。新增demo.py文件, 在MainDialog类中定义了两个槽函数queryWeather()和clearText(),以便在界面文件Weather.ui中定义的两个按钮(queryBtn 和clearBtn) 触发clicked 信号与这两个槽函数进行绑定。
  完整代码如下:
  import sys
  import Weather
  from PyQt5.QtWidgets import QApplication, QDialog
  import requests
  class MainDialog(QDialog):
     def __init__(self, parent=None):
         super(QDialog, self).__init__(parent)
         self.ui = Weather.Ui_Dialog()
         self.ui.setupUi(self)
     def queryWeather(self):
         cityName = self.ui.comboBox.currentText()
         cityCode = self.getCode(cityName)
         r = requests.get(
             "https://restapi.amap.com/v3/weather/weatherInfo?key=f4fd5b287b6d7d51a3c60fee24e42002&city={}".format(
                 cityCode))
         if r.status_code == 200:
             data = r.json()['lives'][0]
             weatherMsg = '城市:{}\n天气:{}\n温度:{}\n风向:{}\n风力:{}\n湿度:{}\n发布时间:{}\n'.format(
                 data['city'],
                 data['weather'],
                 data['temperature'],
                 data['winddirection'],
                 data['windpower'],
                 data['humidity'],
                 data['reporttime'],
             )
         else:
             weatherMsg = '天气查询失败,请稍后再试!'
         self.ui.textEdit.setText(weatherMsg)
     def getCode(self, cityName):
         cityDict = {"北京": "110000",
                     "苏州": "320500",
                     "上海": "310000"}
         **return** cityDict.get(cityName, '101010100')
     def clearText(self):
         self.ui.textEdit.clear()
  if __name__ == '__main__':
     myapp = QApplication(sys.argv)
     myDlg = MainDialog()
     myDlg.show()
     sys.exit(myapp.exec_())
  运行demo.py并执行查询后的效果:
  4、将代码打包成exe文件
  将.py文件打包成可执行的exe在Python中称为freezing,常用的工具有:PyInstaller, py2exe, cx_Freeze, bbfreze, py2app等。功能对比:
   py2exe:软件更新已经不活跃,因此也就略过。
   pyinstaller:明确支持win8、win10、理论上支持win7,,支持apple Macos, linux。pyinsaller可以打包成文件夹形式内含exe入口执行文件的形式,也可以是一个单独的exe文件。
  fbs:基于PyInstaller,使用起来更加方便
  这里选择了fbs来打包。fbs的安装方法:
  pip install fbs
  使用方法,在命令行中输入:
  fbs startproject
  执行完成后需要输入一些APP的名称等。完成后会生成如下目录:
  将刚才编写的PyQt5的代码(demo.py和Weather.py)拖到src/main/python文件夹下,删除原有的main.py,并将demo.py修改为main.py。然后打开 main.py,在文件头部添加如下代码:
  from fbs_runtime.application_context.PyQt5 import ApplicationContext
  ```
  完成后执行:
  ```
  fbs freeze
  ```
  即可实现打包。生成的exe可执行文件在\target\MyApp文件下。

TAG: 软件开发 Python

 

评分:0

我来说两句

Open Toolbar