文章目录

  • 前言
  • UI设计
  • 代码

前言

为什么我要设计这个程序呢?因为我要用,懒得在网上下载了,于是干脆写了一个。

UI设计

UI是我凹出来的,你们要使用,直接新建一个UI.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>283</width><height>365</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralwidget"><widget class="QLabel" name="label"><property name="geometry"><rect><x>20</x><y>10</y><width>81</width><height>21</height></rect></property><property name="font"><font><pointsize>12</pointsize></font></property><property name="text"><string>起始数字:</string></property></widget><widget class="QSpinBox" name="SPstart"><property name="geometry"><rect><x>130</x><y>10</y><width>131</width><height>22</height></rect></property><property name="minimum"><number>-999999999</number></property><property name="maximum"><number>999999999</number></property></widget><widget class="QLabel" name="label_2"><property name="geometry"><rect><x>20</x><y>50</y><width>81</width><height>21</height></rect></property><property name="font"><font><pointsize>12</pointsize></font></property><property name="text"><string>结束数字:</string></property></widget><widget class="QSpinBox" name="SPend"><property name="geometry"><rect><x>130</x><y>50</y><width>131</width><height>22</height></rect></property><property name="minimum"><number>-999999999</number></property><property name="maximum"><number>999999999</number></property></widget><widget class="QPushButton" name="Bstart"><property name="geometry"><rect><x>50</x><y>120</y><width>81</width><height>31</height></rect></property><property name="text"><string>生成</string></property></widget><widget class="QTextBrowser" name="textN"><property name="geometry"><rect><x>30</x><y>170</y><width>221</width><height>101</height></rect></property></widget><widget class="QCheckBox" name="checkBox"><property name="geometry"><rect><x>170</x><y>130</y><width>71</width><height>16</height></rect></property><property name="text"><string>去重</string></property></widget><widget class="QPushButton" name="Bcopy"><property name="geometry"><rect><x>100</x><y>280</y><width>81</width><height>31</height></rect></property><property name="text"><string>复制</string></property></widget><widget class="QSpinBox" name="SPquantity"><property name="geometry"><rect><x>130</x><y>90</y><width>131</width><height>22</height></rect></property><property name="minimum"><number>-999999999</number></property><property name="maximum"><number>999999999</number></property></widget><widget class="QLabel" name="label_3"><property name="geometry"><rect><x>20</x><y>90</y><width>81</width><height>21</height></rect></property><property name="font"><font><pointsize>12</pointsize></font></property><property name="text"><string>生成数量:</string></property></widget></widget><widget class="QMenuBar" name="menubar"><property name="geometry"><rect><x>0</x><y>0</y><width>283</width><height>23</height></rect></property></widget><widget class="QStatusBar" name="statusbar"/><action name="action"><property name="text"><string>1</string></property></action></widget><resources/><connections/>
</ui>

然后这个UI的效果应该是这样的:
UI图片

代码

这玩意儿搞完了以后,就这样新建文件夹及文件:
在这里插入图片描述

新建完以后,就写基本框架了。
首先,先在main.py中写上框架:

import sys
from PyQt5 import QtWidgets, uic
import random #这个东西有大用formClass = uic.loadUiType(【UI.ui的路径】)[0]class RandomNumberGenerator(QtWidgets.QMainWindow, formClass):def __init__(self):super().__init__()self.setupUi(self)app = QtWidgets.QApplication(sys.argv)
window = RandomNumberGenerator()
window.show()
app.exec_()

我这里控件等窗口里的东西的名字都不是很标准,你们看看就好,别学我。
首先,先设置数量这个控件的下限为1,放在类中的__init__里:

class RandomNumberGenerator(QtWidgets.QMainWindow, formClass):def __init__(self):super().__init__()self.setupUi(self)self.SPquantity.setMinimum(1)

然后,绑定每个按钮要处理的事件,并定义好随机数列表,同样放在__init__里:

class RandomNumberGenerator(QtWidgets.QMainWindow, formClass):def __init__(self):super().__init__()self.setupUi(self)self.randomNumber = []self.SPquantity.setMinimum(1)self.Bstart.clicked.connect(self.start)self.Bcopy.clicked.connect(self.copy)

然后就是处理开始生成的事件:

def start(self):if not self.checkBox.isChecked(): #如果去重多选框没有勾选(我懒得重命名这个多选框了)self.randomNumber = [] #清空for i in range(self.SPquantity.value()):self.randomNumber.append(str(random.randint(int(self.SPstart.value()), int(self.SPend.value())))) #分开讲,就是先随机,然后加入随机数列表self.textN.clear() #清空结果self.textN.setText(",".join(self.randomNumber)) #显示随机数else: #反之,如果勾选了self.randomNumber = [] #一样先清空tempL = [i for i in range(int(self.SPstart.value()), int(self.SPend.value())+1)] #把所有范围内的数字列出来for i in range(self.SPquantity.value()): #重复执行 数量 次num = random.choice(tempL) #随机选择self.randomNumber.append(num) #加入(可以把上一行合并在这一行)tempL.remove(num) #删除,也就是防止再次选择到这个数字self.textN.clear() #清空结果self.textN.setText(",".join(self.randomNumber)) #显示结果

然后,就是处理复制按钮的事件了,很简单,不过别忘了在开头加上导入库的代码:

import pyperclip #这个东西要放在开头
def copy(self):pyperclip.copy(self.textN.toPlainText())QtWidgets.QMessageBox.information(self, "提示", "随机数已复制到剪贴板") #删掉也可以

接着,运行一下代码,然后你就会发现
有Bug!

于是,我们就有两个选择:

  1. 特判数据,如果出现结果不正常的情况就报错。
  2. 直接修改SpinBox的上限和下限,从源头阻止Bug。

显然,我肯定会选第二个,然后,就变得复杂起来了

首先,修改我们的__init__方法:

def __init__(self):super().__init__()self.randomNumber = []self.setupUi(self)self.SPquantity.setMinimum(1)self.Bstart.clicked.connect(self.start)self.Bcopy.clicked.connect(self.copy)# 增加这四行:self.SPstart.valueChanged.connect(self.updateSPend)self.checkBox.stateChanged.connect(self.updateSPquantity)self.SPstart.valueChanged.connect(self.updateSPquantity)self.SPend.valueChanged.connect(self.updateSPquantity)

然后就码代码:

def updateSPend(self):self.SPend.setMinimum(self.SPstart.value())def updateSPquantity(self):if self.checkBox.isChecked():self.SPquantity.setMaximum(int(self.SPend.value()) - int(self.SPstart.value()) + 1)else:self.SPquantity.setMaximum(999999999)

至于为什么我不注释……因为当时我忘了,现在又想不起来为什么要这么写了,将就着看吧。

好了,终于来到激动人心的时刻:合并代码:

import sys
from PyQt5 import QtWidgets, uic
import random
import pyperclipformClass = uic.loadUiType(【UI.ui的路径】)[0]class RandomNumberGenerator(QtWidgets.QMainWindow, formClass):def __init__(self):super().__init__()self.randomNumber = []self.setupUi(self)self.SPquantity.setMinimum(1)self.Bstart.clicked.connect(self.start)self.Bcopy.clicked.connect(self.copy)self.SPstart.valueChanged.connect(self.updateSPend)self.checkBox.stateChanged.connect(self.updateSPquantity)self.SPstart.valueChanged.connect(self.updateSPquantity)self.SPend.valueChanged.connect(self.updateSPquantity)def updateSPend(self):self.SPend.setMinimum(self.SPstart.value())def updateSPquantity(self):if self.checkBox.isChecked():self.SPquantity.setMaximum(int(self.SPend.value()) - int(self.SPstart.value()) + 1)else:self.SPquantity.setMaximum(999999999)def start(self):if not self.checkBox.isChecked(): #如果去重多选框没有勾选(我懒得重命名这个多选框了)self.randomNumber = [] #清空for i in range(self.SPquantity.value()):self.randomNumber.append(str(random.randint(int(self.SPstart.value()), int(self.SPend.value())))) #分开讲,就是先随机,然后加入随机数列表self.textN.clear() #清空结果self.textN.setText(",".join(self.randomNumber)) #显示随机数else: #反之,如果勾选了self.randomNumber = [] #一样先清空tempL = [i for i in range(int(self.SPstart.value()), int(self.SPend.value())+1)] #把所有范围内的数字列出来for i in range(self.SPquantity.value()): #重复执行 数量 次num = random.choice(tempL) #随机选择self.randomNumber.append(num) #加入(可以把上一行合并在这一行)tempL.remove(num) #删除,也就是防止再次选择到这个数字self.textN.clear() #清空结果self.textN.setText(",".join(self.randomNumber)) #显示结果def copy(self):pyperclip.copy(self.textN.toPlainText())QtWidgets.QMessageBox.information(self, "提示", "随机数已复制到剪贴板")app = QtWidgets.QApplication(sys.argv)
window = RandomNumberGenerator()
window.show()
app.exec_()

然后,完结撒花(了吗?)

肯定没有。因为我后来发现如果要移动这个小程序,一直修改UI.ui的路径太费时间了,于是,我自己写了点自动搜索路径的代码,于是就变得更方便了:

最后,这是所有的代码了(不会再改了):

import sys
from PyQt5 import QtWidgets, uic
import random
import pyperclip
import pathlibpath = pathlib.Path(__file__)
while path.name != "randomNumberGenerator":path = path.parent
for i in path.rglob("*.ui"):if i.name == 'UI.ui':path = ibreakformClass = uic.loadUiType(path)[0]class RandomNumberGenerator(QtWidgets.QMainWindow, formClass):def __init__(self):super().__init__()self.randomNumber = []self.setupUi(self)self.SPquantity.setMinimum(1)self.Bstart.clicked.connect(self.start)self.Bcopy.clicked.connect(self.copy)self.SPstart.valueChanged.connect(self.updateSPend)self.checkBox.stateChanged.connect(self.updateSPquantity)self.SPstart.valueChanged.connect(self.updateSPquantity)self.SPend.valueChanged.connect(self.updateSPquantity)def updateSPend(self):self.SPend.setMinimum(self.SPstart.value())def updateSPquantity(self):if self.checkBox.isChecked():self.SPquantity.setMaximum(int(self.SPend.value()) - int(self.SPstart.value()) + 1)else:self.SPquantity.setMaximum(999999999)def start(self):if not self.checkBox.isChecked(): #如果去重多选框没有勾选(我懒得重命名这个多选框了)self.randomNumber = [] #清空for i in range(self.SPquantity.value()):self.randomNumber.append(str(random.randint(int(self.SPstart.value()), int(self.SPend.value())))) #分开讲,就是先随机,然后加入随机数列表self.textN.clear() #清空结果self.textN.setText(",".join(self.randomNumber)) #显示随机数else: #反之,如果勾选了self.randomNumber = [] #一样先清空tempL = [i for i in range(int(self.SPstart.value()), int(self.SPend.value())+1)] #把所有范围内的数字列出来for i in range(self.SPquantity.value()): #重复执行 数量 次num = random.choice(tempL) #随机选择self.randomNumber.append(num) #加入(可以把上一行合并在这一行)tempL.remove(num) #删除,也就是防止再次选择到这个数字self.textN.clear() #清空结果self.textN.setText(",".join(self.randomNumber)) #显示结果def copy(self):pyperclip.copy(self.textN.toPlainText())QtWidgets.QMessageBox.information(self, "提示", "随机数已复制到剪贴板")app = QtWidgets.QApplication(sys.argv)
window = RandomNumberGenerator()
window.show()
app.exec_()

这下,是真的完结撒花了。
如果有改代码的建议,记得评论。

#                    _oo0oo_
#                   o8888888o
#                   88" . "88
#                   (| -_- |)
#                   0\  =  /0
#                 ___/`---'\___
#               .' \\|     |// '.
#              / \\|||  :  |||// \
#             / _||||| -:- |||||- \
#            |   | \\\  - /// |   |
#            | \_|  ''\---/''  |_/ |
#            \  .-\__  '-'  ___/-. /
#          ___'. .'  /--.--\  `. .'___
#       ."" '<  `.___\_<|>_/___.' >' "".
#      | | :  `- \`.;`\ _ /`;.`/ - ` : | |
#      \  \ `_.   \_ __\ /__ _/   .-` /  /
#  =====`-.____`.___ \_____/___.-`___.-'=====
#                    `=---='#  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#        佛祖保佑     永不宕机     永无BUG

后记:我的文章发布时再看不知道为什么只剩一半了,还好自动保存救了我一命QAQ。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Oracle SQL:使用 RTRIM 和 TO_CHAR 函数格式化数字并移除多余小数点》

select RTRIM(to_char(1222.11123344,fm9999990.9999),.) from dual 这条 SQL 语句主要用于对数字进行格式化处理&#xff0c;并移除格式化结果右侧多余的小数点。下面将详细拆解该语句的执行过程和各部分作用。语句详细拆解1. to_char(1222.11123344,fm9999990.9999)函数功能&…

「Java案例」方法重装求不同类型数的立方

利用方法重装实现不同类型数值的立方计算 立方计算方法的重载实现 编写一个程序,要求编写重载方法xxx cube(xxx value)实现对不同类型数值计算立方。 # 源文件保存为“CubeCalculator.java” public class CubeCalculator {public static void main(String[] args) {// 测试…

API 接口开发与接入实践:自动化采集淘宝商品数据

在电商数据分析、价格监控等场景中&#xff0c;自动化采集淘宝商品数据具有重要价值。本文将详细介绍如何通过 API 接口开发实现淘宝商品数据的自动化采集&#xff0c;包含完整的技术方案和代码实现。 一、淘宝 API 接入基础 1. 接入流程概述 注册淘宝账号获取 ApiKey 和 Ap…

python-pptx 的layout 布局

一、布局基础概念 在 PowerPoint 中&#xff0c;布局&#xff08;Layout&#xff09; 决定了幻灯片的占位符&#xff08;如标题、内容、图片等&#xff09;的排列方式。python-pptx 提供了对布局的编程控制。二、默认布局类型及索引 通过 prs.slide_layouts[index] 访问&#x…

服务器mysql数据的简单备份脚本

服务器mysql数据的简单备份脚本 一个小型项目mysql数据库数据的定时备份 通过crontab定时执行脚本: 0 1 * * * /home/yuyu/mysqlbak.sh备份文件加入时间戳,防止覆盖支持删除超过x天的备份数据文件&#xff0c;防止备份数据文件太多 #!/bin/bash# 配置变量 DB_HOST"127.0.…

数据分析:从数据到决策的核心逻辑与实践指南

在数据驱动决策的时代&#xff0c;“数据分析” 早已不是专业分析师的专属技能&#xff0c;而是每个职场人都需要掌握的基础能力。但很多人在面对数据时&#xff0c;常会陷入 “罗列数据却无结论”“指标好看却解决不了问题” 的困境。本文将基于数据分析的核心定义、关键维度和…

元宇宙与Web3.0:技术特征、关系及挑战

一、元宇宙的技术特征&#xff08;2025年&#xff09;1. 空间构建技术3D建模与渲染&#xff1a;实时渲染技术&#xff08;如Unity HDRP&#xff09;实现路径追踪光追&#xff0c;AI生成模型&#xff08;NVIDIA Get3D&#xff09;3秒生成3D场景。数字孪生技术&#xff1a;城市级…

关于一个引力问题的回答,兼谈AI助学作用

关于一个引力问题的回答&#xff0c;兼谈AI助学作用今日&#xff0c;一个小朋友问我&#xff0c;他从一本物理科普读物上看到这样依据话&#xff1a;地球对人造地球卫星的引力大于太阳对人造地球卫星的引力&#xff0c;但太阳对月亮的引力大于地球对月亮的引力。因书上没有解释…

Java使用FastExcel实现模板写入导出(多级表头)

依赖配置 (Maven pom.xml)<dependencies><!-- FastExcel 核心库 --><dependency><groupId>cn.idev.excel</groupId><artifactId>fastexcel</artifactId><version>1.0.0</version></dependency><!-- Apache POI…

postman接口测试,1个参数有好几个值的时候如何测试比较简单快速?

3天精通Postman接口测试手动到自动&#xff0c;全套项目实战教程&#xff01;&#xff01;当你在 Postman 中测试接口时&#xff0c;如果一个参数有多个需要测试的值&#xff0c;有几种高效的方法可以实现&#xff1a; 1. 使用 CSV 或 JSON 数据文件进行数据驱动测试 这是最推…

imx6ull UI开发

imx6ull UI开发简介在imx6ull上开发UI 应用硬件层面内核驱动显示设备文件描述符设备树软件LVGL用户空间内核QT在imx6ull上开发UI 应用 在 Linux 系统中&#xff0c;应用程序需要通过操作 RGB LCD 的显存来实现在屏幕上显示字符、图像等信息。由于 Linux 采用严格的内存管理机制…

虚拟化测试工具Parasoft Virtualize如何为汽车企业提供仿真测试?

在汽车电子研发中&#xff0c;传统路测曾是验证ECU&#xff08;电子控制单元&#xff09;、车载通信、OTA升级等功能的可靠手段。然而&#xff0c;随着智能驾驶和软件定义汽车&#xff08;SDV&#xff09;的发展&#xff0c;这种依赖物理车辆的测试方式面临显著挑战&#xff1a…

QT之openGL使用(一)

OpenGL简介 官网&#xff1a;OpenGL - The Industry Standard for High Performance Graphics 中文官网&#xff1a;主页 - LearnOpenGL CN OpenGL&#xff08;Open Graphics Library&#xff09;是一种跨语言、跨平台的图形编程接口&#xff0c;主要用于渲染二维和三维矢量…

基于生成对抗网络增强主动学习的超高温陶瓷硬度优化

复现论文:基于生成对抗网络增强主动学习的超高温陶瓷硬度优化 我将使用Python复现这篇关于使用生成对抗网络(GAN)增强主动学习来优化超高温陶瓷(UHTC)硬度的研究论文。以下是完整的实现代码和解释。 1. 环境准备和数据加载 首先,我们需要准备必要的Python库并加载数据。 …

hadoop(服务器伪分布式搭建)

1. 报错 Windows 上写的脚本 拷贝到 Linux&#xff08;比如 CentOS&#xff09;系统时会出现。 bash: ./set_java_home.sh: /bin/bash^M: bad interpreter: No such file or directory 报错原因 ^M 是 Windows 的换行符&#xff08;\r\n&#xff09; Linux 使用的是 Unix 格式的…

超详细 anji-captcha滑块验证springboot+uniapp微信小程序前后端组合

目录 1&#xff1a;pom文件引入jar包 2&#xff1a;配置文件 3&#xff1a;踩坑-1 4&#xff1a;踩坑-2 5&#xff1a;后端二次验证 6&#xff1a;自定义背景图 给用户做的一个小程序&#xff0c;被某局安全验证后&#xff0c;说登录太简单&#xff0c;没有验证码等行为认…

使用AVPlayer播放FairPlay DRM视频的最佳实践

01DRM 介绍DRM&#xff0c;即数字版权管理&#xff08;Digital Rights Management&#xff09;&#xff0c;是指使用加密技术保护视频内容、通过专业技术安全地存储和传输密钥&#xff08;加密密钥和解密密钥&#xff09;、并允许内容生产商设置商业规则&#xff0c;限制内容观…

《机器学习数学基础》补充资料:拉格朗日乘子法

瑞士数学家欧拉&#xff08;Leonhard Euler&#xff0c;1707-1783&#xff09;的大名&#xff0c;如雷贯耳——欧拉&#xff0c;是按德文发音翻译。欧拉不仅是公认的十八世纪最伟大的数学家&#xff0c;还是目前史上最多产的数学家。所著的书籍及论文多达 886 部&#xff08;篇…

【PTA数据结构 | C语言版】二叉堆的朴素建堆操作

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 请编写程序&#xff0c;将 n 个顺序存储的数据用朴素建堆操作调整为最小堆&#xff1b;最后顺次输出堆中元素以检验操作的正确性。 输入格式&#xff1a; 输入首先给出一个正整数 c&#xff08;≤1…

深入解析PyQt5信号与槽的高级玩法:解锁GUI开发新姿势

信号与槽机制是PyQt框架实现组件间通信的核心技术。掌握其高级用法能极大提升开发效率和代码灵活性。本文将通过六大核心模块&#xff0c;结合实战案例&#xff0c;全方位解析信号与槽的进阶使用技巧。自定义信号与槽的完全指南 1. 信号定义规范 class CustomWidget(QWidget):#…