PyQt学习笔记-获取Hash值的小工具

news2024/11/18 15:33:59

目录

  • 一、概述
    • 1.1 版本信息:
    • 1.2 基本信息:
      • 1.2.1 软件支持的内容:
      • 1.2.2 支持的编码格式
    • 1.3 软件界面图
  • 二、代码实现
    • 2.1 View
    • 2.2 Controller
    • 2.3 Model
  • 三、测试示例

一、概述

本工具居于hashlib+PyQt+QFileDialog写的小工具,主要是为了简单的获取相关文件或者一些数据的哈希值数据。

1.1 版本信息:

以下为使用到的相关类库的版本信息

  • PyQt5 5.14.0
  • PyQt5-sip 12.12.2
  • pyqt5-tools 5.14.0.1.7
  • Python 3.8.6
    当前小工具的版本信息如下:
  • V1.0.0.0

1.2 基本信息:

1.2.1 软件支持的内容:

以下为当前小工具支持获取哈希值的文件类型及文本信息:

  • 普通文本文件:.txt、.docs、.doc、.xml等
  • 图片文件:.png、.gif等
  • 压缩包文件:.zip等
  • 应用程序:.exe、.msi
  • 直接文本框输入文本
  • 其他的未进一步验证
    注: 打开文件时,数据的文本框中显示的是文件的完整路径,而非具体数据内容。

1.2.2 支持的编码格式

以下为当前版本小工具支持的编码格式:

  • MD5
  • SHA1
  • SHA256

实际子项编程时,可以根据自己的需要添加更多的编码格式,具体可以参考hashlib类库的使用 。
Python学习笔记-使用哈希算法Hash,Hashlib进行数据加密

1.3 软件界面图

在这里插入图片描述
软件界面如上图,基本功能说明如下:

  1. 通过上方单选按钮选择不同的编码方式;
  2. 通过“打开文件”可以选择想要获取hash值的文件,此时只是获取文件路径,并显示在数据中;
  3. 亦可以根据自己需要将具体的文本数据直接输入到数据文本框中;
  4. 点击“计算”按钮,软件会自动识别是否为文件,或者文本内容,进行Hash值计算,并显示在下方;
  5. 点击“清除数据”按钮,可以快速的清除数据以及计算出来的Hash值。

注意: 若是输入文本进行计算时,为了避免空格无法观测,造成的信息错误,会默认将首尾的空格删掉。

二、代码实现

代码采用MVC架构模式设计,便于代码的分离解耦,也进一步多练习练习MCV模式的设计。

2.1 View

View是界面,用于与用户进行交互。
使用PyQt进行界面开发,主界面继承于QMainWindow类,通过QGridLayout和QHBoxLayout进行布局。

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

from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QTextEdit
from PyQt5.QtWidgets import QLineEdit
from PyQt5.QtWidgets import QLabel
from PyQt5.QtWidgets import QGridLayout
from PyQt5.QtWidgets import QHBoxLayout
from PyQt5.QtWidgets import QRadioButton
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon



class MainWindow(QMainWindow):
    "Main Window"

    def __init__(self) -> None:
        """Init"""

        super().__init__()
        self.init_ui()
        
    def init_ui(self):
        """Init Ui"""

        self.setMinimumSize(400,300)
        self.resize(400,300)
        self.setWindowTitle("Hash Code V1.0.0.0")
        self.setWindowIcon(QIcon("res\Gear 2.ico"))

        self.central_widget = QWidget()
        """ main widget """
        self.setCentralWidget(self.central_widget)

        self.layout_main = QGridLayout()
        self.central_widget.setLayout(self.layout_main)

        # Hash type buttong.
        self.layout_hashtype = QHBoxLayout()
        self.layout_main.addLayout(self.layout_hashtype, 0, 0, Qt.AlignmentFlag.AlignTop)

        self.radio_md5 = QRadioButton("MD5")
        self.radio_md5.setChecked(True)
        self.layout_hashtype.addWidget(self.radio_md5)
        self.radio_sha1 = QRadioButton("SHA1")
        self.layout_hashtype.addWidget(self.radio_sha1)
        self.radio_sha256 = QRadioButton("SHA256")
        self.layout_hashtype.addWidget(self.radio_sha256)
        self.layout_hashtype.addStretch(1)
        self.btn_openfile = QPushButton("打开文件")
        self.layout_hashtype.addWidget(self.btn_openfile,alignment=Qt.AlignmentFlag.AlignRight)

        # Data
        self.layout_main.addWidget(QLabel("数据:"), 1, 0, Qt.AlignmentFlag.AlignLeft)
        self.txt_data = QTextEdit()
        self.txt_data.setToolTip("""打开文件时则获取文件的Hash值,非文件时直接获取文本框中文本的Hash值!\r\n默认清除首尾空格!""")
        self.layout_main.addWidget(self.txt_data, 2, 0)
        self.txt_data.setMinimumHeight(50)

        # Hash
        self.layout_value = QHBoxLayout()
        self.layout_main.addLayout(self.layout_value, 3, 0)
        self.layout_value.addWidget(QLabel("Hash值:"))
        self.layout_value.addStretch(1)
        self.btn_clear = QPushButton("清除数据")
        self.layout_value.addWidget(self.btn_clear, alignment=Qt.AlignmentFlag.AlignRight)
        self.btn_calc = QPushButton("计算")
        self.layout_value.addWidget(self.btn_calc, alignment=Qt.AlignmentFlag.AlignRight)

        self.txt_value = QTextEdit()
        self.layout_main.addWidget(self.txt_value, 4, 0)

2.2 Controller

Controller是界面与模块只见的中间层,用于链接双方。
以继承的方式,直接继承界面,然后进行逻辑编写。
另外一种方式是,界面集成QObject,然后初始化的时候创建一个View类。

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

import os
import hashlib
from PyQt5.QtWidgets import QFileDialog
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QTextEdit
from PyQt5.QtWidgets import QLineEdit
from PyQt5.QtWidgets import QLabel
from PyQt5.QtWidgets import QGridLayout
from PyQt5.QtWidgets import QHBoxLayout
from PyQt5.QtWidgets import QRadioButton

from view.main_view import MainWindow

class MainWindowController(MainWindow):
    """The controller of mainwindow"""

    def __init__(self) -> None:
        """Init"""

        super().__init__()
        self.btn_openfile.clicked.connect(self.openfile)
        self.btn_clear.clicked.connect(self.clear)
        self.btn_calc.clicked.connect(self.gethash)

        self.show()

    def openfile(self):
        """Open File"""

        # 打开文件
        filepath, filetypelist = QFileDialog.getOpenFileName()
        self.txt_data.setText(filepath)
        
    def gethash(self):
        """Get Hash Value"""

        # 判断是否未文件,为文件时读取文件进行校验
        data = self.txt_data.toPlainText().strip()
        try:
            if os.path.exists(data):
                file = open(data, "rb")
                data_b = file.read()
            else:
                data_b = data.encode("utf-8")
        except Exception as err:
            self.txt_value.setText(err)
        
        # 计算哈希值,根据不同选项选择不同的算法。
        if self.radio_md5.isChecked():
            hash_value = hashlib.md5(data_b).hexdigest()
        elif self.radio_sha1.isChecked():
            hash_value = hashlib.sha1(data_b).hexdigest()
        elif self.radio_sha256.isChecked():
            hash_value = hashlib.sha256(data_b).hexdigest()
        else:
            return
        
        # 显示哈希值
        self.txt_value.setText(str(hash_value).upper())
        
    def clear(self):
        """Get Hash Value"""

        self.txt_value.clear()
        self.txt_data.clear()

2.3 Model

小工具,没有model。

三、测试示例

示例1:直接输入文本,然后计算该文本的MD5值。
在这里插入图片描述
示例2:打开一个.exe应用程序文件,然后计算该文件的MD5值。
在这里插入图片描述

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

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

相关文章

中国移动启动算网大脑“天穹”全网试商用

10月12日,中国移动在2023全球合作伙伴大会主论坛正式启动算网大脑“天穹”全网试商用,全面开启算力网络2.0新征程,标志着中国移动算力网络迈向“融合统一”新阶段。 为落实国家“东数西算”战略,中国移动开创性提出算力网络新理念…

操作系统【OS】微内核

基本概念 微内核结构将操作系统划分为两大部分:微内核多个服务器微内核包含: 与硬件处理紧密相关的部分一些较基本的功能客户和服务器间的通信客户与服务器之间是借助微内核提供的消息传递机制来实现交互的 基本功能 进程管理 进程的通信、切换、调度…

【算法练习Day24】递增子序列全排列全排列 II

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 递增子序列容易出错的地方 …

微信手续费2023标准

不管是微信还是支付宝,商户最低的收款手续费率可以达到0.2%费率。一般我们普通商户的收款费率一般在0.6左右,当然也有使用0.3的,也就是1万元的费率是30-60块钱,对于一些流水比较大的商家来说,确实很有必要把这个手续费…

【实用技巧】Latex写算法伪代码(格式篇)

本文主要介绍个人在编写Latex算法伪代码时所遇到的格式问题。 目录 包冲突换行与缩进算法换页 包冲突 \usepackage{algorithm} \usepackage{algorithmic} \usepackage{algorithmicx} \usepackage{algpseudocode} 网上查找算法伪代码第三方包,主要会跳出来这四…

虹科案例 | 瑞士Agroscope研究所利用压力传感器自动测量反刍动物(奶牛)的咀嚼运动

——用于动物测量研究的数据记录仪:虹科MSR145 瑞士Agroscope研究所隶属于联邦农业办公室,是农业、食品和环境领域可持续发展的推动力量,为农业和环境政策决策以及法规执行提供科学和技术基础。 作为Agroscope研究所的合作代表&…

【超详细】CentOS 7安装MySQL 5.7【安装及密码配置、字符集配置、远程连接配置】

准备工作:CentOS 7系统,并确保可以联通网络 1、获取MySQL 5.7 Community Repository软件包 注意:这里使用的是root用户身份。 wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm2、安装软件包 rpm -ivh mysql5…

PyTorch入门教学——TensorBoard使用

1、TensorBoard简介 TensorBoard是Google开发的一个机器学习可视化工具。其主要用于记录机器学习过程,例如: 记录损失变化、准确率变化等记录图片变化、语音变化、文本变化等。例如在做GAN时,可以过一段时间记录一张生成的图片绘制模型 2、…

数字秒表VHDL启动暂停清零,源码和视频

名称:数字秒表VHDL启动暂停清零(代码在文末付费下载) 软件:Quartus 语言:VHDL 代码功能: 数字秒表 使用VHDL语言设置数字秒表。要求具有百分秒、秒和分钟显示,百分秒范围00-99,秒范围00-59,分钟范围0…

《java 桌面软件开发》swing 以鼠标为中心放大缩小移动图片

swing 使用Graphic2D 绘制图片,要实现对图片进行缩放和自由拖动。 1.以鼠标所在的位置为中心,滚轮控制缩放 2.缩放后再支持鼠标拖动。 基本原理: 利用scale() 函数。进行缩放。但是要注意的地方是,如果是在 public void paintCom…

Linux 下安装配置部署MySql8.0

一 . 准备工作 MySQL安装包:在官网下载需要的版本,这里我用的版本是 MySQL 8.0.34 https://dev.mysql.com/downloads/mysql/ 本次linux机器使用的是阿里云ECS实例 二 . 开始部署 1. 将安装包上传至服务器 解压到当前文件夹 tar -zxvf mysql-8.0.34…

Python 实现http server接收mutipart/form-data文件 方法1

Python 实现http server接收mutipart/form-data文件 方法1 1 Server端代码2 客户端截图3 代码说明 1 Server端代码 import os from flask import Flask, request from werkzeug.utils import secure_filenameapp Flask(__name__) app.config[UPLOAD_FOLDER] E://recv//app.ro…

玩游戏缺失“d3d11.dll丢失“的问题的五种解决方案

在我日常的计算机维护工作中,经常遇到一些用户报告他们遇到了"d3d11.dll丢失"的问题。这是一个常见的Windows系统错误,通常会导致程序无法正常运行。在这篇文章中,我将分享我找到的五种有效的解决方法,以帮助这些用户解…

开源的容器运行时项目 Podman

本心、输入输出、结果 文章目录 开源的容器运行时项目 Podman前言Podman 简介Podman 与 Docker 的区别Podman 在使用上和 Docker 有什么区别从构建者角度分析 Podman 在使用上和 Docker 有什么区别从使用者角度分析 Podman 在使用上和 Docker 有什么区别 Podman 常用命令容器镜…

Linux shell编程学习笔记14:编写和运行第一个shell脚本hello world!

* 20231020 写这篇博文断断续续花了好几天,为了说明不同shell在执行同一脚本文件时的差别,我分别在csdn提供线上Linux环境 (使用的shell是zsh)和自己的电脑上(使用的shell是bash)做测试。功夫不负有心人&am…

详解如何利用Pytest Cache Fixture实现测试结果缓存

这篇文章主要为大家详细介绍了如何利用Pytest Cache Fixture实现测试结果缓存,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下− 前言 接口自动关过程中,经常会遇到这样一些场景,“请求2需要用到请求1响应的数据”,常见的…

人脸识别顶会论文及源码合集,含2023最新

今天和大家聊聊人脸识别。 人脸识别的技术经过不断发展已经相当成熟,在门禁、监控、手机解锁、移动支付等实际场景都能看到。我们比较熟悉的识别方式是基于可见光图像的人脸识别,这种方式有个非常明显的缺点:光线限制。 在近两年的人脸识别…

如何解决NSIS 2G文件的限制

Internal compiler error #12345: error mmapping datablock to 33556079.Note: you may have one or two (large) stale temporary file(s) left in your temporary directory (Generally this only happens on Windows 9x). 最近在使用NSIS打包一个7.3GB的可执行程序时&…

【算法|动态规划No.25】leetcode LCR 020. 回文子串

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

Spring学习笔记注解式开发(3)

Spring学习笔记(3) 一、Bean的注解式开发1.1、注解开发的基本和Component1.2 注解式开发8.3、Component的三个衍生注解 二、Bean依赖注入注解开发2.1、依赖注入相关注解2.2、Autowired扩展 三、非自定义Bean注解开发四、Bean配置类的注解开发五、Spring注…