<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Pyqt5小案例,界面與邏輯分離的小計(jì)算器程序

          共 10925字,需瀏覽 22分鐘

           ·

          2022-07-06 13:15

          直接看下最終效果:

          使用技術(shù)總結(jié)

          • 使用Designer設(shè)計(jì)界面
          • 使用pyuic5命令導(dǎo)出到python文件
          • 新建邏輯處理文件,繼承pyuic5導(dǎo)出的文件的類,在里面編寫信號與槽的處理邏輯

          使用Designer設(shè)計(jì)界面

          要使用Designer,安裝一個Python庫即可:

          pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5 pyqt5-tools

          我用的是python 3.9版本,發(fā)現(xiàn)3.10會報錯,3.9沒問題

          在此過程中,用到了如下組件:

          • QLabel、QlineEdit、QPushButton
          • 先從小范圍再到大范圍,進(jìn)行布局管理
          • 按鈕的上下方,加上彈簧

          然后保存成ui文件

          使用pyuic5將ui文件導(dǎo)出成python文件

          然后執(zhí)行如下命令:

          pyuic5 -o computer.py computer.ui

          即可生成computer.py

          為什么要用界面與邏輯分離

          主要是用Designer設(shè)計(jì)的界面,肯定要多次調(diào)整的。如果每次調(diào)整后,生成新的py文件,就會把自己寫的代碼給覆蓋了。

          因此,最好是界面的ui生成的python代碼,和自己的分離。

          用繼承機(jī)制就可以:

          先看下pyuic5生成的代碼文件(如下代碼是自動生成的,不用多看):

          # -*- coding: utf-8 -*-

          # Form implementation generated from reading ui file 'computer.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_Form(object):
              def setupUi(self, Form):
                  Form.setObjectName("Form")
                  Form.resize(1006, 577)
                  self.verticalLayout = QtWidgets.QVBoxLayout(Form)
                  self.verticalLayout.setObjectName("verticalLayout")
                  self.horizontalLayout = QtWidgets.QHBoxLayout()
                  self.horizontalLayout.setObjectName("horizontalLayout")
                  self.label = QtWidgets.QLabel(Form)
                  self.label.setObjectName("label")
                  self.horizontalLayout.addWidget(self.label)
                  self.lineEdit_num01 = QtWidgets.QLineEdit(Form)
                  self.lineEdit_num01.setObjectName("lineEdit_num01")
                  self.horizontalLayout.addWidget(self.lineEdit_num01)
                  self.verticalLayout.addLayout(self.horizontalLayout)
                  self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
                  self.horizontalLayout_2.setObjectName("horizontalLayout_2")
                  self.label_2 = QtWidgets.QLabel(Form)
                  self.label_2.setObjectName("label_2")
                  self.horizontalLayout_2.addWidget(self.label_2)
                  self.lineEdit_num02 = QtWidgets.QLineEdit(Form)
                  self.lineEdit_num02.setObjectName("lineEdit_num02")
                  self.horizontalLayout_2.addWidget(self.lineEdit_num02)
                  self.verticalLayout.addLayout(self.horizontalLayout_2)
                  spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
                  self.verticalLayout.addItem(spacerItem)
                  self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
                  self.horizontalLayout_3.setObjectName("horizontalLayout_3")
                  self.pushButton_add = QtWidgets.QPushButton(Form)
                  self.pushButton_add.setObjectName("pushButton_add")
                  self.horizontalLayout_3.addWidget(self.pushButton_add)
                  self.pushButton_minus = QtWidgets.QPushButton(Form)
                  self.pushButton_minus.setObjectName("pushButton_minus")
                  self.horizontalLayout_3.addWidget(self.pushButton_minus)
                  self.pushButton_multi = QtWidgets.QPushButton(Form)
                  self.pushButton_multi.setObjectName("pushButton_multi")
                  self.horizontalLayout_3.addWidget(self.pushButton_multi)
                  self.pushButton_divide = QtWidgets.QPushButton(Form)
                  self.pushButton_divide.setObjectName("pushButton_divide")
                  self.horizontalLayout_3.addWidget(self.pushButton_divide)
                  self.verticalLayout.addLayout(self.horizontalLayout_3)
                  spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
                  self.verticalLayout.addItem(spacerItem1)
                  self.label_result = QtWidgets.QLabel(Form)
                  font = QtGui.QFont()
                  font.setPointSize(18)
                  self.label_result.setFont(font)
                  self.label_result.setStyleSheet("QLabel{\n"
          "color:red;\n"
          "}")
                  self.label_result.setText("")
                  self.label_result.setObjectName("label_result")
                  self.verticalLayout.addWidget(self.label_result)

                  self.retranslateUi(Form)
                  QtCore.QMetaObject.connectSlotsByName(Form)

              def retranslateUi(self, Form):
                  _translate = QtCore.QCoreApplication.translate
                  Form.setWindowTitle(_translate("Form""Form"))
                  self.label.setText(_translate("Form""請輸入第一個數(shù)字:"))
                  self.label_2.setText(_translate("Form""請輸入第二個數(shù)字:"))
                  self.pushButton_add.setText(_translate("Form""+"))
                  self.pushButton_minus.setText(_translate("Form""-"))
                  self.pushButton_multi.setText(_translate("Form""*"))
                  self.pushButton_divide.setText(_translate("Form""/"))

          在里面有個類,叫做:Ui_Form

          我們可以繼承這個類,然后編寫編寫自己的邏輯即可

          import sys

          from computer import Ui_Form
          from PyQt5.QtWidgets import QApplication, QWidget


          class MyUiComputer(Ui_Form):
              def __init__(self, window):
                  super().__init__()
                  self.setupUi(window)
                  self.pushButton_add.clicked.connect(self.do_compute("+"))
                  self.pushButton_minus.clicked.connect(self.do_compute("-"))
                  self.pushButton_multi.clicked.connect(self.do_compute("*"))
                  self.pushButton_divide.clicked.connect(self.do_compute("/"))

              def do_compute(self, method):
                  def func():
                      try:
                          num01 = self.lineEdit_num01.text()
                          num02 = self.lineEdit_num02.text()
                          if method == "+":
                              self.label_result.setText("計(jì)算結(jié)果:" + str(int(num01) + int(num02)))
                          elif method == "-":
                              self.label_result.setText("計(jì)算結(jié)果:" + str(int(num01) - int(num02)))
                          elif method == "*":
                              self.label_result.setText("計(jì)算結(jié)果:" + str(int(num01) * int(num02)))
                          elif method == "/":
                              self.label_result.setText("計(jì)算結(jié)果:" + str(int(num01) / int(num02)))
                      except Exception as e:
                          self.label_result.setText(f"error: {e}")

                  return func


          if __name__ == "__main__":
              app = QApplication(sys.argv)

              window = QWidget()

              my_ui_computer = MyUiComputer(window)
              window.show()

              sys.exit(app.exec_())

          這是我們自己的代碼,有幾點(diǎn):

          1、需要自己初始化 QWidget 作為入口窗口 然后調(diào)用pyuic5生成代碼中的 self.setupUi(window) 設(shè)置主窗口;

          2、這個代碼主要是編寫自己的信號與槽的鏈接

          3、這個代碼也有一個知識,connect的槽函數(shù),是可以傳參數(shù)的,技巧就是自己的函數(shù)返回一個函數(shù) 見do_compute函數(shù)

          總結(jié)

          依然回顧下pyqt5開發(fā)的流程:

          • 用Designer設(shè)計(jì)界面
          • 用pyuic5將ui文件導(dǎo)出成python文件
          • 用繼承的方法,編寫自己的類文件,實(shí)現(xiàn)自己的信號處理邏輯
          • 自己的代碼中,初始化入口的Window,傳給pyuic5的文件作為啟動入口

          預(yù)告:螞蟻老師的《Python使用PyQT5開發(fā)界面程序》課程,即將開始更新,如果購買大套餐將來會免費(fèi)看新課!

          今晚來螞蟻老師抖音直播間,Python帶副業(yè)全套餐有優(yōu)惠!!!



          瀏覽 166
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操中国老女人逼视频 | 国产一区xxx | 大香蕉久久伊人网 | 大香蕉网伊 | 乱av在线 |