python实战之PyQt5桌面软件

一. 演示效果

二. 准备工作

1. 使用pip 下载所需包 pyqt5
2. 下载可视化UI工具 QT Designer

链接:https://pan.baidu.com/s/1ic4S3ocEF90Y4L1GqYHPPA?pwd=ywct

提取码:ywct

3. 可视化UI工具汉化

把上面的链接打开, 里面有安装和汉化包, 前面的路径还要看你安装在哪里, 然后把汉化包直接放到这个文件夹中就可以了

4. pycharm配置QT Designer


Arguments: -m PyQt5.uic.pyuic FileName -o FileNameWithoutExtension.py
QT Designer作用: 快速打开QT Designer布局工具

PyUIC作用: .ui布局文件转成.py布局文件, 也就是test.ui -> test.py

三. 代码

1. 文件结构
2. 代码

test.ui

python 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <property name="toolButtonStyle">
   <enum>Qt::ToolButtonIconOnly</enum>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>250</x>
      <y>90</y>
      <width>91</width>
      <height>41</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>16</pointsize>
      <weight>50</weight>
      <bold>false</bold>
     </font>
    </property>
    <property name="text">
     <string>欢迎使用</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_2">
    <property name="geometry">
     <rect>
      <x>370</x>
      <y>90</y>
      <width>181</width>
      <height>41</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>16</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>计时器</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_3">
    <property name="enabled">
     <bool>true</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>220</x>
      <y>100</y>
      <width>21</width>
      <height>21</height>
     </rect>
    </property>
    <property name="text">
     <string/>
    </property>
    <property name="pixmap">
     <pixmap>../resources/icon/icon.ico</pixmap>
    </property>
    <property name="scaledContents">
     <bool>true</bool>
    </property>
   </widget>
   <widget class="QSlider" name="horizontalSlider">
    <property name="geometry">
     <rect>
      <x>110</x>
      <y>190</y>
      <width>571</width>
      <height>16</height>
     </rect>
    </property>
    <property name="mouseTracking">
     <bool>false</bool>
    </property>
    <property name="orientation">
     <enum>Qt::Horizontal</enum>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>230</x>
      <y>260</y>
      <width>75</width>
      <height>23</height>
     </rect>
    </property>
    <property name="text">
     <string>开始计时</string>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton_2">
    <property name="geometry">
     <rect>
      <x>430</x>
      <y>260</y>
      <width>75</width>
      <height>23</height>
     </rect>
    </property>
    <property name="text">
     <string>重置计时</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_4">
    <property name="geometry">
     <rect>
      <x>700</x>
      <y>190</y>
      <width>31</width>
      <height>16</height>
     </rect>
    </property>
    <property name="text">
     <string>0</string>
    </property>
   </widget>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources>
  <include location="../resources/icon/qrcResources.qrc"/>
 </resources>
 <connections>
  <connection>
   <sender>horizontalSlider</sender>
   <signal>sliderMoved(int)</signal>
   <receiver>label_4</receiver>
   <slot>setNum(int)</slot>
   <hints>
    <hint type="sourcelabel">
     <x>395</x>
     <y>197</y>
    </hint>
    <hint type="destinationlabel">
     <x>715</x>
     <y>197</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>label_4</sender>
   <signal>windowIconTextChanged(QString)</signal>
   <receiver>horizontalSlider</receiver>
   <slot>setFocus()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>715</x>
     <y>197</y>
    </hint>
    <hint type="destinationlabel">
     <x>395</x>
     <y>197</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>pushButton</sender>
   <signal>clicked()</signal>
   <receiver>label_4</receiver>
   <slot>update()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>267</x>
     <y>271</y>
    </hint>
    <hint type="destinationlabel">
     <x>715</x>
     <y>197</y>
    </hint>
   </hints>
  </connection>
 </connections>
</ui>

test.py

python 复制代码
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'test.ui'
#
# Created by: PyQt5 UI code generator 5.15.10
#
# 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
from PyQt5.QtWidgets import QApplication


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        MainWindow.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(250, 90, 91, 41))
        font = QtGui.QFont()
        font.setPointSize(16)
        font.setBold(False)
        font.setWeight(50)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(370, 90, 181, 41))
        font = QtGui.QFont()
        font.setPointSize(16)
        font.setBold(True)
        font.setWeight(75)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setEnabled(True)
        self.label_3.setGeometry(QtCore.QRect(220, 100, 21, 21))
        self.label_3.setText("")
        self.label_3.setPixmap(QtGui.QPixmap("../resources/icon/icon.ico"))
        self.label_3.setScaledContents(True)
        self.label_3.setObjectName("label_3")
        self.horizontalSlider = QtWidgets.QSlider(self.centralwidget)
        self.horizontalSlider.setGeometry(QtCore.QRect(110, 190, 571, 16))
        self.horizontalSlider.setMouseTracking(False)
        self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
        self.horizontalSlider.setObjectName("horizontalSlider")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(230, 260, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(430, 260, 75, 23))
        self.pushButton_2.setObjectName("pushButton_2")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(700, 190, 31, 16))
        self.label_4.setObjectName("label_4")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.horizontalSlider.sliderMoved['int'].connect(self.label_4.setNum) # type: ignore
        self.label_4.windowIconTextChanged['QString'].connect(self.horizontalSlider.setFocus) # type: ignore
        self.pushButton.clicked.connect(self.zidongflush) # type: ignore
        QtCore.QMetaObject.connectSlotsByName(MainWindow)


    def zidongflush(self):
        # 按钮设置不可点击
        self.pushButton.setText("进行中...")
        self.pushButton.setEnabled(False)
        # 假设 label_4 已经设置了数字文本,尝试转换成整数
        try:
            numb = int(self.label_4.text())
        except ValueError:
            numb = 10  # 如果不能转换,则默认为0

        for _ in range(numb, -1, -1):  # 从 numb 开始递减至 0
            self.label_4.setText(str(_))  # 设置新的文本
            self.label_4.update()  # 触发重绘
            self.horizontalSlider.setValue(_)
            # 等待一段时间,模拟计时
            QtCore.QThread.msleep(1000)
            QApplication.processEvents()  # 让事件循环有机会处理其他事件,防止界面卡死

        self.pushButton.setText("开始计时")
        self.pushButton.setEnabled(True)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "欢迎使用"))
        self.label_2.setText(_translate("MainWindow", "计时器工具"))
        self.pushButton.setText(_translate("MainWindow", "开始计时"))
        self.pushButton_2.setText(_translate("MainWindow", "重置计时"))
        self.label_4.setText(_translate("MainWindow", "0"))

main.py

python 复制代码
import sys

from PyQt5.QtWidgets import QApplication, QMainWindow

from UI.test import Ui_MainWindow

if __name__ == '__main__':
    # 创建QApplication实例,传入系统命令行参数
    app = QApplication(sys.argv)

    # 创建主窗口,一个应用程序通常只有一个主窗口
    MainWindow = QMainWindow()

    # 加载主窗口的用户界面,Ui_MainWindow是自动生成的类,用于控制界面布局和元素
    ui = Ui_MainWindow()

    # 使用ui类中的方法设置主窗口的界面,完成界面初始化
    ui.setupUi(MainWindow)

    # 设置主窗口的标题
    MainWindow.setWindowTitle('HG')

    # 显示主窗口,使得用户可以与之交互
    MainWindow.show()

    # 运行应用程序,直到应用程序结束。这里退出应用程序的条件通常是用户关闭了主窗口
    sys.exit(app.exec_())

四. 打包- pyinstaller

说明: 桌面软件开发完毕之后, 需要打包成.exe文件, 这样才能分发给其他人使用

下载好之后, 把pyinstaller配置到电脑的PATH中, 这样就可以使用cmd执行了

打包后的样子

完毕!!! 希望可以让刚开始学的小伙伴增加点思路~

相关推荐
岑梓铭1 分钟前
(CentOs系统虚拟机)Standalone模式下安装部署“基于Python编写”的Spark框架
linux·python·spark·centos
游客52015 分钟前
opencv中的各种滤波器简介
图像处理·人工智能·python·opencv·计算机视觉
Eric.Lee202118 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
Dontla23 分钟前
vscode怎么设置anaconda python解释器(anaconda解释器、vscode解释器)
ide·vscode·python
qq_529025291 小时前
Torch.gather
python·深度学习·机器学习
数据小爬虫@1 小时前
如何高效利用Python爬虫按关键字搜索苏宁商品
开发语言·爬虫·python
Cachel wood2 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
終不似少年遊*2 小时前
pyecharts
python·信息可视化·数据分析·学习笔记·pyecharts·使用技巧
Python之栈2 小时前
【无标题】
数据库·python·mysql
袁袁袁袁满2 小时前
100天精通Python(爬虫篇)——第113天:‌爬虫基础模块之urllib详细教程大全
开发语言·爬虫·python·网络爬虫·爬虫实战·urllib·urllib模块教程