基于PyQt5的图形化界面开发——自制Redis图形化客户端(文末附源码)

news2025/1/22 8:39:26

基于PyQt5的图形化界面开发——自制Redis图形化客户端

  • 前言
  • 1. Python第三方库安装及Redis学习
    • 1.1 Python第三方库安装
    • 1.2 Redis数据库安装和基础命令
  • 2. 登录界面
    • 2.1 login.py
    • 2.2 image_login.py
  • 3. 主界面
    • 3.1 main_ui.py
    • 3.2 image_main.py
  • 4.界面切换
  • 5. 写在最后(附下载链接)

前言

之前我们学习了Redis数据库的基本操作,现在我们来一边学习PyQt5图形化界面开发,一边来加深对Redis的操作。

对于计算机基础薄弱的同学而言命令操作数据库似乎太过抽象,用图形化界面的方式操作有利于加深理解。

这次我们先看使用效果,效果如下:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

操作系统:Windows10 专业版
开发环境:Pycahrm Comunity 2022.3
Python解释器版本:Python3.8
第三方库: Redis,PyQt5

1. Python第三方库安装及Redis学习

1.1 Python第三方库安装

本次需要用到的库为 Redis 和 PyQt5

PyQt5 用于编写图形化界面
Redis 用于操作数据库

如果你不会安装第三方库,你可以参考我的以下文章进行学习:
使用vscode、pycharm安装Python第三方库

1.2 Redis数据库安装和基础命令

如果你不会安装数据库、启动数据库,你可以参考以下文章,并且还可以学习Redis基础语句:
Redis数据库的安装(Windows10)

Redis数据库常用语句

2. 登录界面

Redis数据库是需要登录的,可能你会在多个服务器(主机)上部署多个数据库,又或许你的数据库端口号并非默认6379端口,亦或许你的密码由于不下心泄露或者其他原因需要更改,这都将导致我们频繁的对代码进行修改。

所以我们采用登录界面的方式,为这些可能变换的信息提供更改的可能:
在这里插入图片描述
预期效果是以上这样,在正确输入以后会完成登录,跳转至操作界面,由于这次我们添加了图片,所以添加了一份资源代码,代码如下:

2.1 login.py

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

# Form implementation generated from reading ui file '.\login.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# 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


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(372, 353)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(110, 130, 191, 21))
        self.lineEdit.setObjectName("lineEdit")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(60, 130, 31, 20))
        self.label.setObjectName("label")
        self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_3.setGeometry(QtCore.QRect(110, 190, 191, 21))
        self.lineEdit_3.setEchoMode(QtWidgets.QLineEdit.Password)
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(50, 190, 51, 20))
        self.label_3.setObjectName("label_3")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(110, 160, 191, 21))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(60, 160, 31, 20))
        self.label_2.setObjectName("label_2")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(140, 270, 93, 28))
        self.pushButton.setObjectName("pushButton")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(90, 20, 221, 91))
        self.label_4.setStyleSheet("border-image:url(:/image/redis.png)")
        self.label_4.setText("")
        self.label_4.setObjectName("label_4")
        self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox.setGeometry(QtCore.QRect(140, 240, 91, 19))
        self.checkBox.setObjectName("checkBox")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(110, 220, 191, 20))
        self.label_5.setText("")
        self.label_5.setObjectName("label_5")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 372, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Redis-登录"))
        self.label.setText(_translate("MainWindow", "Host"))
        self.label_3.setText(_translate("MainWindow", "Passwd"))
        self.label_2.setText(_translate("MainWindow", "Port"))
        self.pushButton.setText(_translate("MainWindow", "登录"))
        self.checkBox.setText(_translate("MainWindow", "记住密码"))
        
import image_login

2.2 image_login.py

资源文件,存放图片等资源

太长了,待会将完整工程打包放在文末的链接供下载

3. 主界面

主界面需要有完成各个操作的功能,为了简化界面(偷懒),这里我只放了字符串,列表,集合三种结构,代码如下:

3.1 main_ui.py

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

# Form implementation generated from reading ui file '.\main.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# 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


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(467, 343)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(290, 220, 121, 31))
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(50, 170, 251, 16))
        self.label_3.setText("")
        self.label_3.setObjectName("label_3")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(140, 10, 191, 91))
        self.label_4.setStyleSheet("border-image: url(:/image/redis.png);")
        self.label_4.setText("")
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(330, 270, 111, 20))
        self.label_5.setObjectName("label_5")
        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(50, 110, 351, 48))
        self.widget.setObjectName("widget")
        self.gridLayout = QtWidgets.QGridLayout(self.widget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.label = QtWidgets.QLabel(self.widget)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.widget)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 0, 1, 1, 1)
        self.lineEdit = QtWidgets.QLineEdit(self.widget)
        self.lineEdit.setObjectName("lineEdit")
        self.gridLayout.addWidget(self.lineEdit, 1, 0, 1, 1)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.widget)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.gridLayout.addWidget(self.lineEdit_2, 1, 1, 1, 1)
        self.widget1 = QtWidgets.QWidget(self.centralwidget)
        self.widget1.setGeometry(QtCore.QRect(50, 200, 199, 67))
        self.widget1.setObjectName("widget1")
        self.formLayout = QtWidgets.QFormLayout(self.widget1)
        self.formLayout.setContentsMargins(0, 0, 0, 0)
        self.formLayout.setObjectName("formLayout")
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.pushButton = QtWidgets.QPushButton(self.widget1)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        self.pushButton_2 = QtWidgets.QPushButton(self.widget1)
        self.pushButton_2.setObjectName("pushButton_2")
        self.verticalLayout.addWidget(self.pushButton_2)
        self.formLayout.setLayout(0, QtWidgets.QFormLayout.LabelRole, self.verticalLayout)
        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.widget1)
        self.pushButton_3.setObjectName("pushButton_3")
        self.verticalLayout_2.addWidget(self.pushButton_3)
        self.pushButton_4 = QtWidgets.QPushButton(self.widget1)
        self.pushButton_4.setObjectName("pushButton_4")
        self.verticalLayout_2.addWidget(self.pushButton_4)
        self.formLayout.setLayout(0, QtWidgets.QFormLayout.FieldRole, self.verticalLayout_2)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 467, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Redis-主界面"))
        self.comboBox.setItemText(0, _translate("MainWindow", "字符串"))
        self.comboBox.setItemText(1, _translate("MainWindow", "列表"))
        self.comboBox.setItemText(2, _translate("MainWindow", "集合"))
        self.label_5.setText(_translate("MainWindow", "by --IoT_h2"))
        self.label.setText(_translate("MainWindow", "KEY"))
        self.label_2.setText(_translate("MainWindow", "VALUE"))
        self.pushButton.setText(_translate("MainWindow", "添加"))
        self.pushButton_2.setText(_translate("MainWindow", "删除"))
        self.pushButton_3.setText(_translate("MainWindow", "显示当前KEY"))
        self.pushButton_4.setText(_translate("MainWindow", "显示所有KEY"))
import image_main

3.2 image_main.py

资源文件,用于存放图片等资源

太长了,待会将完整工程打包放在文末的链接供下载

4.界面切换

这次的界面切换和以往不同,不必那么麻烦了,只是添加了一个登录跳转主界面的操作,还有两个数据显示界面的跳转。

需要 注意 的是,点击登录,登录界面应该隐藏,而显示数据界面弹出的时候,主界面不应该关闭。

5. 写在最后(附下载链接)

如果发生报错,请检查你是否安装第三方库或是否改动了此工程结构:

在这里插入图片描述
下载链接如下,注意下载后要解压才能正常打开:

点我下载

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

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

相关文章

软件测试笔记(三):黑盒测试

1 黑盒测试概述 黑盒测试也叫功能测试,通过测试来检测每个功能是否都能正常使用。在测试中,把程序看作是一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,对程序接口进行测试,只检查程序功能是否按…

Java——把数组排成最小的数

题目链接 牛客网在线oj题——把数组排成最小的数 题目描述 输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 例如输入数组[3,32,321],则打印出这三个数字能…

汇编语言(第3版)- 学习笔记 - 第1章-基础知识

汇编语言(第3版)- 学习笔记 - 第1章-基础知识 1.1 机器语言1.2 汇编语言的产生1.3 汇编语言的组成1.4 存储器1.5 指令和数据1.6 存储单元1.7 CPU对存储器的读写1.8 地址总线1.9 数据总线1.10 控制总线1.11 内存地址空间(概述)1.12 主板1.13 接口卡1.14 各…

NSSCTF-[NSSRound#X Basic]ez_z3 [MoeCTF 2022]Art [HDCTF2023]basketball

目录 NSSCTF-[NSSRound#X Basic]ez_z3 [MoeCTF 2022]Art [HDCTF2023]basketball NSSCTF-[NSSRound#X Basic]ez_z3 题目下载:下载 查壳: 发现有upx壳,但是使用upx -d命令不能脱壳,载入十六进制编辑器查看 把XYU改为UPX&#x…

netty/websocket服务器配置阿里云SSL证书安全访问配置,亲测有效

背景:java 微服务包括https访问和websocket访问,当https接口访问ws请求时报错,因为https能访问wss。 申请阿里云免费证书后,搜索各种教程比如nginx配置方式、netty访问证书等。走了不少弯路,终于走通一种。 关键点:1…

龙蜥开发者说:亲历从基础设施构建到系统质量保障,龙蜥未来可期 | 第 19 期

「龙蜥开发者说」第 19 期来了!开发者与开源社区相辅相成,相互成就,这些个人在龙蜥社区的使用心得、实践总结和技术成长经历都是宝贵的,我们希望在这里让更多人看见技术的力量。本期故事,我们邀请了龙蜥社区开发者宋彦…

【Python】值得收藏,三元一次方程组的计算,快来看看有什么新奇的~~~

三元一次方程组的计算对于大家来说都不陌生了,但是用编程语言来解决方程组问题想必还是会有些大聪明们有点迷糊的,今天就带大家来看看是怎么利用python实现方程组的解集的; 本文主要分成两部分: 解题验算综述 解题 题目1 代码 …

Security中使用Redis管理会话(模拟cookie实现)

配置redis相关 1. 配置Redis package com.zzhua.blog.config.redis;import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.cor…

【HCIP】IPV6综合实验(ripng,ospfv3,bgp,6to4)

目录 一、IP规划 二、 连通公网部分(IPv4) 三、R1、R2上IPv4+v6配置 四、IPV6部分ip配置 五、IPV6部分OSPF&BGP协议配置 Ⅰ、 ospf Ⅱ、bgp 六、联通网络 需求: 1、AR1处于IPV4,也有IPV6的地址,有两个环回 2、AR45678处…

Golang Gin 请求参数绑定与多数据格式处理

之前学习了使用Gin框架的Engine的默认路由功能解析HTTP请求。现在我们来学习gin框架的参数绑定操作和请求结果返回格式。 处理POST请求时,使用context.PostForm或者context.DefaultPostForm获取客户端表单提交的数据。 像上述这种只有username和password两个字段的表…

CS:APP 第7章链接分步编译(cpp/cc1/as/ld)遇到的问题

环境 WSL Ubuntu 22.04.2 LTS gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 问题 问题一 cc1 命令找不到 cc1 命令在 /usr/lib/gcc/x86_64-linux-gnu/11/cc1 里,注意不同操作系统等可能 cc1 的位置不一样,可以使用 find 或者 locate 命令搜索。 通过下…

聊点技术 | 架构瘦身,让Bonree ONE跑得更轻

4月21日,博睿数据ONE有引力2023春季产品发布会圆满落幕,一体化智能可观测平台Bonree ONE 2023春季正式版正式发布,这一次发布的版本更轻、更强、更智能。 Bonree ONE在上一版基础上削减50%组件数量,下架两大高耗能组件&#xff0c…

97-TCP为什么要有一个“TIME_WAIT“的状态

文章目录 1.TCP为什么要有一个"TIME_WAIT"的状态(1) 可靠的终止 TCP 连接。(2) 保证让迟来的 TCP 报文有足够的时间被识别并被丢弃 ; 2.拓展带外数据 1.TCP为什么要有一个"TIME_WAIT"的状态 "TIME_WAIT"状态存在的原因主要有两点: (1) 可靠的终…

成功经验分享,Nacos注册中心实践,带你玩转Nacos

1、什么是 Nacos ? 官方:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 集: 注册中心配置中心服务管理 平台 nacos的特性包括: 服务发现和服务健康监测动态配置服务动态…

行人检测(人体检测)4:C++实现人体检测(含源码,可实时人体检测)

行人检测(人体检测)4:C实现人体检测(含源码,可实时人体检测) 目录 行人检测(人体检测)4:C实现人体检测(含源码,可实时人体检测) 1. 前言 2. 行人检测(人体检测)检测模型(YOLOv5) (1&#xf…

谈「效」风生 | 如何找到现有研发体系的「内耗问题」?

#第3期:如何找到现有研发体系的「内耗问题」?# 在上一期《谈到提升效能,我们应该如何下手?》我们聊到开始做研发效能的四个要点:评估现有流程、引入自动化工具、建立度量指标、持续改进。本期就围绕「评估现有研发体系…

二次创业接地气、强内功,三只松鼠从一棵树出发重造“人设”

民以食为天,自古以来,“吃”都是一门浅显与深奥并存的生意。产业链看似简单:种、收、制、卖,却足以令众多企业为之前赴后继十年、百年。 三只松鼠,正在这条变革的道路上砥砺前行。自去年4月开启全面转型以来&#xff…

C++ 赋值运算符重载

赋值运算符重载 运算符重载: C为了增强代码的可读性,可以对 运算符 进行重载,运算符重载 就是具有特殊函数名的函数,这个函数也具有返回值类型,函数名字和参数列表,它的返回值和参数列表的形式和普通函数…

基于SAM的二次开发案例收集分享

一、AnyLabeling[1]——制作人:vietanhdev AnyLabeling LabelImg Labelme Improved UI Autolabeling AnyLabeling软件是一个集成了YOLO、Segment Anything模型(AI支持)的高效数据标注工具,它可以通过点击目标的方式完成目标检…

商业银行财富管理“智能原生”能力呈阶梯化,AI助力商业模式趋向多元化发展

易观:金融业的财富管理从经营角度来看,是“客户与渠道管理场景运营产品研发”三位一体共同构建以客户为中心,数据驱动的业务经营体系。其中,“客户与渠道管理”是将客户利益作为核心目标,通过升级用户体验、客户全生命…