Pyqt5入门--用qtdesigner设计一个计算屏幕PPI小程序(qtdesigner/pyuic/pyinstaller/python)

本文利用python中的pyqt5包,设计一个计算PPI小程序的界面,再利用pyuic将界面的ui文件转为py文件。再新建一个py文件继承界面py文件中类,并定义每一个按钮对应的函数,完成后利用pyinstaller打包成exe程序直接运行使用。接下来将介绍整个程序的实现过程。

  • 前期安装准备(本文使用pycharm配合python3.7完成)
  • 建议使用pip install安装,安装后将designer和pyuic添加到external tools中
  • pyqt5
  • PyQt5-tools(这个里才有designer.exe)
  • pyinstaller

一、利用qtdesigner设计一个界面

  • 步骤
  • 1.pycharm->tools->external tools->qtdesigner
  • 2.新建一个Dialog without Buttons(选main window和widget也可以,这里建议与本文一致) (补充:三种窗口的区别)
  • 3.根据图片设计好程序界面
  • 4.保存为.ui文件
    在这里插入图片描述

二、利用pyuic将ui文件转为py文件

  • 步骤
  • 1.在pycharm中打开保存的ui文件
  • 2.点tools->external tools->pyuic
  • 3.生成的py文件如下
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'ppi.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_ppi(object):
    def setupUi(self, ppi):
        ppi.setObjectName("ppi")
        ppi.resize(458, 328)
        self.label = QtWidgets.QLabel(ppi)
        self.label.setGeometry(QtCore.QRect(120, 30, 211, 31))
        font = QtGui.QFont()
        font.setFamily("微软雅黑")
        font.setPointSize(18)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.groupBox = QtWidgets.QGroupBox(ppi)
        self.groupBox.setGeometry(QtCore.QRect(80, 80, 281, 171))
        self.groupBox.setObjectName("groupBox")
        self.label_2 = QtWidgets.QLabel(self.groupBox)
        self.label_2.setGeometry(QtCore.QRect(30, 40, 54, 12))
        self.label_2.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.label_2.setAutoFillBackground(False)
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(self.groupBox)
        self.label_3.setGeometry(QtCore.QRect(30, 70, 54, 12))
        self.label_3.setAlignment(QtCore.Qt.AlignCenter)
        self.label_3.setObjectName("label_3")
        self.label_4 = QtWidgets.QLabel(self.groupBox)
        self.label_4.setGeometry(QtCore.QRect(30, 100, 54, 12))
        self.label_4.setAlignment(QtCore.Qt.AlignCenter)
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(self.groupBox)
        self.label_5.setGeometry(QtCore.QRect(30, 140, 54, 12))
        self.label_5.setAlignment(QtCore.Qt.AlignCenter)
        self.label_5.setObjectName("label_5")
        self.comboBox = QtWidgets.QComboBox(self.groupBox)
        self.comboBox.setGeometry(QtCore.QRect(100, 40, 151, 22))
        self.comboBox.setAcceptDrops(False)
        self.comboBox.setAutoFillBackground(True)
        self.comboBox.setEditable(True)
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox_2 = QtWidgets.QComboBox(self.groupBox)
        self.comboBox_2.setGeometry(QtCore.QRect(100, 70, 151, 22))
        self.comboBox_2.setEditable(True)
        self.comboBox_2.setObjectName("comboBox_2")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_3 = QtWidgets.QComboBox(self.groupBox)
        self.comboBox_3.setGeometry(QtCore.QRect(100, 100, 151, 22))
        self.comboBox_3.setEditable(True)
        self.comboBox_3.setObjectName("comboBox_3")
        self.comboBox_3.addItem("")
        self.comboBox_3.addItem("")
        self.comboBox_3.addItem("")
        self.comboBox_3.addItem("")
        self.comboBox_3.addItem("")
        self.comboBox_3.addItem("")
        self.result = QtWidgets.QTextEdit(self.groupBox)
        self.result.setGeometry(QtCore.QRect(100, 130, 151, 31))
        self.result.setObjectName("result")
        self.enter = QtWidgets.QPushButton(ppi)
        self.enter.setGeometry(QtCore.QRect(150, 260, 75, 23))
        self.enter.setObjectName("enter")
        self.clear = QtWidgets.QPushButton(ppi)
        self.clear.setGeometry(QtCore.QRect(240, 260, 75, 23))
        self.clear.setObjectName("clear")

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

    def retranslateUi(self, ppi):
        _translate = QtCore.QCoreApplication.translate
        ppi.setWindowTitle(_translate("ppi", "Dialog"))
        self.label.setText(_translate("ppi", "计算屏幕PPI小程序"))
        self.groupBox.setTitle(_translate("ppi", "请输入"))
        self.label_2.setText(_translate("ppi", "长"))
        self.label_3.setText(_translate("ppi", "宽"))
        self.label_4.setText(_translate("ppi", " 英寸"))
        self.label_5.setText(_translate("ppi", "PPI"))
        self.comboBox.setItemText(0, _translate("ppi", "2560"))
        self.comboBox.setItemText(1, _translate("ppi", "1920"))
        self.comboBox_2.setItemText(0, _translate("ppi", "1440"))
        self.comboBox_2.setItemText(1, _translate("ppi", "1080"))
        self.comboBox_3.setItemText(0, _translate("ppi", "27"))
        self.comboBox_3.setItemText(1, _translate("ppi", "24"))
        self.comboBox_3.setItemText(2, _translate("ppi", "23.8"))
        self.comboBox_3.setItemText(3, _translate("ppi", "16"))
        self.comboBox_3.setItemText(4, _translate("ppi", "14"))
        self.comboBox_3.setItemText(5, _translate("ppi", "13.8"))
        self.enter.setText(_translate("ppi", "确定"))
        self.clear.setText(_translate("ppi", "清除"))

三、新建一个ppi_new.py

注意:调试的时候如果没有提示报错的具体原因:run->edit configurations->emulate terminal in output console

# -*- coding: utf-8 -*-
# 建议用from...import 可以减小程序大小(实际上还是有30多M,还没找到更好的办法)
from sys import argv,exit
# from PyQt5.QtWidgets import *
# from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow,QApplication
from ppi import Ui_ppi

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent) # 继承界面文件的属性,方便调用和修改,因为自动生成的界面py中有一句:WARNING! All changes made in this file will be lost!
        self.ui = Ui_ppi() # 调用界面类
        self.ui.setupUi(self) # 调用界面函数

        self.ui.clear.clicked.connect(self.clear) # 调用自定义的清除按钮
        self.ui.enter.clicked.connect(self.enter) # 调用自定义的确定按钮

    def enter(self):
        length = self.ui.comboBox.currentText() # 获取复选框中的内容
        width = self.ui.comboBox_2.currentText()
        inch = self.ui.comboBox_3.currentText()
        msg1 = self.calculate(length=length,width=width,inch=inch) # 计算结果
        ppi_result = str(round(msg1,2)) # 将数字转换为文本,并取2位小数,否则会报错格式不对应
        self.ui.result.setText(ppi_result) # 将结果发送到文本框中

    def calculate(self, length, width, inch):
        ppi_result = ((float(length)**2 + float(width)**2)**(1/2))/float(inch) # 定义函数,注意这里要加float否则会报错格式不对应
        return ppi_result

    def clear(self):
        self.ui.result.clear() # 定义清除按钮


if __name__ == '__main__':
    app = QApplication(argv) # 初始化窗口
    win = MainWindow()
    win.show() # 运行程序
    exit(app.exec_()) # 退出窗口

四、用pyinstaller打包成exe程序

如果在pycharm中run能出现程序界面,并且正常执行功能,说明已经能正常使用,这时就可以用pyinstaller打包

  • 步骤
  • win+r->cmd->输入cd /d e:\qtdesigner\ppi
  • (注:进入ppi_new文件所在目录e:\qtdesigner\ppi\ppi_new.py)(这里要修改成自己的所在文件夹)
  • 输入pyinstaller -F ppi_new.py -w
  • (注-F为生成单文件exe, -w为运行时不显示命令行窗口)
  • 生成的exe文件在e:\qtdesigner\ppi\dist\ppi_new.exe
  • 双击exe文件运行
    运行结果

猜你喜欢

转载自blog.csdn.net/lzykevin/article/details/103547281