python实战之PyQt5桌面软件

news2024/11/26 16:52:47

一. 演示效果

在这里插入图片描述

二. 准备工作

1. 使用pip 下载所需包 pyqt5

在这里插入图片描述

2. 下载可视化UI工具 QT Designer

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

3. 可视化UI工具汉化

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

在这里插入图片描述

4. pycharm配置QT Designer

pycharm配置QT
在这里插入图片描述

Arguments: -m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py

QT Designer作用: 快速打开QT Designer布局工具
PyUIC作用: .ui布局文件转成.py布局文件, 也就是test.ui -> test.py

在这里插入图片描述

三. 代码

1. 文件结构

在这里插入图片描述

2. 代码

test.ui

<?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

# -*- 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


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执行了

在这里插入图片描述

打包后的样子

exe可以直接运行

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1554009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小白python爬虫基础教程(看这一篇就完了)

爬虫的五个步骤&#xff1a; 1&#xff09;需求分析&#xff0c;找到需求相关的网址 2&#xff09;获取网址的返回信息&#xff08;urllib,requests&#xff09; 3&#xff09;定位需要的信息所在位置&#xff08;re正则表达式,XPATH, CSS selector&#xff09; 4&#xff…

开通幻兽帕鲁游戏多人联机服务器多少钱?价格意想不到

2024年全网最全的幻兽帕鲁服务器租用价格表&#xff0c;阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月&#xff0c;阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全&#xff1a; 阿里云幻…

在微信上处理小程序用户反馈具体的方法

想必大家在开发小程序的时候&#xff0c;一定遇到这种情况&#xff1a; 为了用户有更好的体验&#xff0c;我们会定期登陆微信小程序来查看用户反馈并对用户的问题进行回复和处理&#xff0c;但是这种方法的缺点就是最多间隔48小时要进行登陆一次以及回复用户不及时。 这样的话…

codesys通过moudbus TCP连接西门子1214c,西门子做客户端

思路在codesys中发送数据到西门子&#xff0c;西门子原封不动的将数据传回。 1.首先配置codesys; 我设置了500个&#xff0c;但是好像发不这么多&#xff0c;只能120多个。因为什么来我忘了。但是这里不影响。 2.配置映射&#xff1a; 3.写代码 PROGRAM PLC_PRG VARarySendDa…

大模型助力学术图谱挖掘!OAG-Challenge @ KDD Cup 2024正式开始

如何用大模型推动学术知识图谱挖掘任务&#xff1f;OAG-Challenge KDD Cup 2024 邀你来赛&#xff01; 竞赛网址&#xff1a;https://www.biendata.xyz/kdd2024/ 竞赛背景 自 1997 年创办以来&#xff0c;知识发现和数据挖掘会议 ACM SIGKDD 上举办的 KDD Cup 被誉为全球最…

【微服务】Sentinel(流量控制)

文章目录 1.基本介绍1.Sentinel是什么2.Sentinel主要特性3.Sentinel核心功能1.流量控制2.熔断降级3.消息削峰填谷 4.Sentinel两个组成部分 2.Sentinel控制台显示1.需求分析2.下载3.运行1.进入cmd2.输入java -jar sentinel-dashboard-1.8.0.jar3.查看默认端口8080 4.访问1.账号和…

考研数学|《660》完全不会做怎么办?【注意】

很多人有一个误区&#xff1a; 不仅仅是做660题的误区&#xff0c;很多人做其他的习题册都有这个误区&#xff0c;就是以为太依靠答案&#xff0c;如果一道题目做不出来&#xff0c;也不去思考&#xff0c;就直接去看答案怎么做&#xff0c;然后把答案看会了&#xff0c;就认为…

如何利用OpenCV4.9 更改图像的对比度和亮度

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;使用 OpenCV 添加&#xff08;混合&#xff09;两个图像 下一篇:如何利用OpenCV4.9离散傅里叶变换 ​目标 在本教程中&#xff0c;您将学习如何&#xff1a; 访问像素值用零…

路由的完整使用

多页面和单页面 多页面是指超链接等跳转到另一个HTML文件,单页面是仍是这个文件只是路由改变了页面的一部分结构. 路由的基本使用 使用vue2,则配套的路由需要是第3版. 1)下载vue-router插件 2)引入导出函数 3)new 创建路由对象 4)当写到vue的router后只能写路由对象,因此只…

Git版本管理使用手册 - 8 - 合并分支、解决冲突

合并整个开发分支 切换到本地test分支&#xff0c;选择右下角远程开发分支&#xff0c;选择Merge into Current。然后提交到远程test仓库。 合并某次提交的代码 当前工作区切换成test分支&#xff0c;选择远程仓库中的dev开发分支&#xff0c;选择需要合并的提交版本右击&a…

cmd小黑框——命令行基础语句与实操效果演示

cmd小黑框——命令行学习 初识cmd小黑框cmd命令缩写含义介绍cmd基础操作cmd实操效果演示cmd命令行快捷键 初识cmd小黑框 CMD&#xff0c;全称Command&#xff0c;是Windows系统中自带的一个命令行解释器&#xff0c;它允许用户通过输入命令来对系统进行各种操作。CMD命令在Win…

从运营层面看财务管理:如何做好项目的财务预算

有效的项目运营是企业发展进步的主要活动&#xff0c;企业管理者的项目财务管理主要针对项目财务预算。项目财务预算管理是企业财务管理的一个分支&#xff0c;也是项目财务管理的核心部分&#xff0c;其表现形式为一个综合性的财务计划&#xff0c;主要包括预算编制、报告、执…

SQL Server 实验二:数据库视图的创建和使用

目录 第一关 相关知识 什么是表 操作数据表 创建数据表 插入数据 修改表结构 删除数据表 编程要求 第一关实验代码&#xff1a; 第二关 相关知识 视图是什么 视图的优缺点 视图的优点 视图的缺点 操作视图 创建视图 通过视图向基本表中插入数据 通过视图修改基本表的…

武汉星起航引领跨境电商新潮流,一站式方案助力创业者快速崛起

在跨境电商领域&#xff0c;武汉星起航电子商务有限公司以其独特的一站式解决方案&#xff0c;为众多创业者提供了通往成功的捷径。该公司凭借专业的团队和丰富的经验&#xff0c;为创业者提供全方位的支持&#xff0c;助力他们在跨境电商领域实现快速发展。 随着全球经济的不…

线性规划-非线性规划-非线性规划遗传算法

遗传算法当前获得的最优值作为非线性寻优的初始解&#xff0c;随后进行求解。

从创意立项到产品赚钱的全调优过程复盘,如何提高产品存活率 | TopOn变现干货

10月28日&#xff0c;由TopOn、罗斯基联合主办的“游戏赛道新机会”主题沙龙在成都举办。活动邀请了国内外多位知名公司及游戏爆款产品的负责人分享&#xff0c;分别从各自的方向及经验出发&#xff0c;以数据、案例、产品分析、行业趋势等多个维度&#xff0c;为行业从业者带来…

C++初阶篇----string类

目录 引言标准库中的string类string类的常用接口string类对象的常见构造string类对象的string类对象的访问及遍历string类对象的修改string类非成员函数 引言 什么是string类&#xff1f; string 类是 C 标准库中的一个类&#xff0c;用于处理字符串。它提供了一系列方法来创建…

北斗激光平地机提高农机耕种效率

北斗激光平地机提高农机耕种效率 湖北省浠水县地处大别山南麓&#xff0c;六成左右的田块都分布在丘陵地带&#xff0c;田块小、高低落差大&#xff0c;给机械化作业带来诸多不便。在今年的春耕中&#xff0c;配备北斗智能检测终端的激光平地机很受当地种粮大户追捧。 稻田平整…

超声波清洗机选购指南:眼镜清洗器哪个好?4款眼镜清洗利器推荐

随着科技的发展&#xff0c;现在就是连洗眼镜都有专门的辅助工具了&#xff0c;没错&#xff0c;就是超声波眼镜清洗机&#xff01;这种超声波清洗机之所以能够做到清洁眼镜&#xff0c;是因为它利用了超声波振动原理&#xff0c;通过水分子爆破瞬间的冲击力对眼镜上面的污垢进…

2024 年广西职业院校技能大赛高职组《云计算应用》赛项样卷

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜…