吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2254|回复: 5
收起左侧

[Python 转载] Rdies+python编写可视化数据储存工具

[复制链接]
Test_dada 发表于 2021-4-19 18:31
本帖最后由 Test_dada 于 2021-4-25 14:33 编辑

成品图

成品图

运行环境需要下载:

Redis3.2.1(直接解压即可,无需安装),解压后运行redis_sever.exe启动服务
安装必要的python第三方包(redis、tkinter、tkcalendar),在命令窗口使用pip命令安装


实现功能:
查询:已存在用户数据查询,在用户名输入‘全部’,查看所有用户
保存:保存新用户,或更新数据;默认记录当前时间,过期时间为30天
用户过期时间:查询用户剩余过期时间
删除用户数据:删除单个用户数据
清屏:清除文本内容




1.10更新内容:
1.添加多用户保存功能,以中文或英文逗号隔开/
2.优化接收区排版


2.10更新内容:
新增时间栏:可指定时间储存和查询,但不可查询某段时间的全部数据
在用户名输入‘全部’,查看所有用户

觉得有用的小伙伴,收藏评分点赞三连哟


代码如下
[Python] 纯文本查看 复制代码
import redis
import time
from tkinter import *
from tkinter import scrolledtext,ttk
import tkinter.messagebox  # 这个是消息框,对话框的关键
from tkcalendar import Calendar
from babel import numbers   # pyintsller打包后Calendar需要此库,所以要导入不然Calendar报错

class radis_sever():

    def __init__(self):
        '''
        host,port,db:ip,端口,数据库名
        decode_responses = true 设置为True返回的数据格式就是时str类型
        '''
        # os.system('''cd E:\Redis &\
        #              e: &\
        #              redis-server.exe''')   #启动redis服务,每行最后加上&,多行执行

        self.pool  = redis.ConnectionPool(host='localhost', port=6379, db=0, decode_responses=True)
        self.rs = redis.StrictRedis(connection_pool=self.pool)


    def now_time(self):
        '''当前时间格式化'''
        return str(time.strftime("%Y-%m-%d", time.localtime()))


    def Dbsize(self):
        '''读取总键数'''
        return '数据总数:',self.rs.dbsize()


    def Keys(self,model):
        '''
        返回指定模式的key
        pattern:
        * ,代表任意个字符
        ? ,代表一个字符
        [],字符集合
        '''
        return self.rs.keys(pattern=model)


    def Expire(self, name, time=30):
        '''设置过期时间,默认30天'''
        # rsp = self.rs.expire(name, time*24*60*60)
        # return rsp
        pass


    def Ttl(self, name):
        '''查看过期时间'''
        if name == '':
            self.log_insert('请输入要查询的用户名!')
        else:
            name = self.Strip(name)
            self.log_dl()
            seconds = self.rs.ttl(name)   # 过期时间s
            m, s = divmod(seconds, 60)
            h, m = divmod(m, 60)
            if h == -1:
                self.log_insert("【%s】该用户未设置过期时间"%name)
            else:
                d, h = divmod(h, 24)
                self.log_insert("\n%d天/%02d时/%02d分/%02d秒 后过期删除" % (d, h, m, s))
                return self.rs.ttl(name)


    def log_insert(self, str):
        '''在文本框打印log'''
        self.Receive_Window.insert(END,str+'\n')


    def log_dl(self,values=''):
        '''清除文本框log'''
        self.default_value1.set('可不选日历,默认为当前时间')
        self.Receive_Window.delete(0.0, END)
        self.E_name.delete(0, END)    # 输入框清除代码,执行后自动清除
        self.data.delete(0, END)  # 输入框清除代码,执行后自动清除


    def Delete(self,name):
        '''删除存在的key,并返回成功删除个数'''
        if name == '':
            self.log_insert('请输入要删除的用户名!')
        else:
            name = self.Strip(name)
            num = self.rs.delete(name)
            self.log_dl()
            self.log_insert('成功删除【%s】条数据:%s'%(num, name))



    def Strip(self,name):
        '''保存前去除前后空格'''
        return name.strip()

    def Shutdown(self):
        '''关闭服务'''
        return self.rs.shutdown(save=False, nosave=False)


    def Hsets(self, name, values, Key):
        '''批量存入'''
        self.log_dl()   # 清除文本
        if name == '':
            self.log_insert('用户名不能为空!')
        elif values == '':
            self.log_insert('数据栏不能为空!')
        elif ',' in name:
            self.log_insert('检测到【{0}】条数据需要保存'.format(len(name.split(','))))
            # 循环保存
            for n in name.split(','):
                self.Hset(n,values, Key)
        elif ',' in name:
            self.log_insert('检测到【{0}】条数据需要保存'.format(len(name.split(','))))
            for n in name.split(','):
                self.Hset(n, values, Key)
        else:
            self.log_insert('检测到【1】条数据需要保存')
            self.Hset(name, values, Key)


    def Hset(self, name, values, Key):
        '''单个存入字典
        name:
        Key:要存入的键名,可不填,默认为当前时间
        values:存入的数据
        '''
        name = self.Strip(name)  # 保存前去除前后空格
        try:
            if Key == '可不选日历,默认为当前时间':
                Key = self.now_time()   # 设置默认时间

            if self.rs.exists(name):    # 判断name是否存在,True存在
                if Key not in self.rs.hkeys(name) or self.rs.hgetall(name)[Key] == '':
                    # 判断键名是否存在hkeys(name)键名列表中,或键值为空
                    self.rs.hset(name, Key, values) # 保存新值
                    self.Expire(name)  # 设置name过期时间,默认30天
                    # 显示在scrolledtext.ScrolledText滚动文本框上
                    self.log_insert('【%s】保存成功!\n[%s]:' % (name, Key)+self.rs.hgetall(name)[Key])
                else:
                    # print(self.rs.hkeys(name))
                    values_list = self.rs.hgetall(name)[Key].split(',') # 获取键值,字符串转列表
                    values_list.append(values)  # 添加新值
                    self.rs.hset(name, Key, ','.join(values_list))   #拼接存入新值
                    self.Expire(name)  # 设置name过期时间,默认30天
                    self.log_insert('【%s】更新成功!\n[%s]:'%(name, Key)+self.rs.hgetall(name)[Key])

            else:
                # name不存在直接保存
                self.rs.hset(name, Key, values)
                self.Expire(name)  # 设置name过期时间,默认30天
                self.log_insert('【%s】保存成功!\n[%s]:' % (name, Key) + self.rs.hgetall(name)[Key])

        except Exception as e:
            self.log_insert(str(e))
            return str(e)


    def Hgetall(self, name, Key=None):
        '''读取字典'''
        if name == '':
            self.log_insert('请输入要查询的用户名!')
        elif name == '全部':
            self.log_dl()
            key_list = [key for key in self.Keys('*')] # 返回所有name
            self.log_insert('当前共有[%s]名用户\n%s'%(len(key_list),'\n'.join(key_list)))
        else:
            name = self.Strip(name)
            self.log_dl()
            try:
                if name in self.Keys('*'): # 返回所有name
                    if Key == '可不选日历,默认为当前时间':
                        dc = self.rs.hgetall(name)
                        list = ['【%s】:%s'%(k,v) for k,v in dc.items()]    # 字典键和值转换为列表
                        str = '\n'.join(list)   # 列表换行拼接
                        # tkinter.messagebox.showinfo('提示', str) #提示框
                        self.log_insert('【%s】查询成功\n%s'%(name,str))    # 显示在scrolledtext.ScrolledText滚动文本框上
                        return self.rs.hgetall(name)    # 返回name的所有数据
                    else:
                        str = self.rs.hgetall(name)[Key]    # 字符串类型:大哥,二哥,三哥
                        # tkinter.messagebox.showinfo('提示', str.split(',')) #提示框
                        self.log_insert('%s【%s】查询成功\n%s'%(name,Key,str.split(',')))  # 显示在scrolledtext.ScrolledText滚动文本框上
                        return str.split(',')    # 切割返回列表类型
                else:
                    self.log_insert('没有找到[%s]【%s】该用户数据'%(name,Key))
            except Exception as e:
                # tkinter.messagebox.showinfo('提示', '没有找到[%s]该用户数据\n%s'%(name,e))
                self.log_insert('没有找到[%s]该用户数据\n【错误信息】%s'%(name,e))
                return '没有找到[%s]该用户数据'%name

    def example1(self):
        '''日历'''
        def print_sel():
            # cal.selection_get()获取用户确定的时间2018-02-08类型timedata
            self.default_value1.set(str(cal.selection_get()))
            top.destroy()  # 关闭时间窗口,不关闭主体,关闭主体用quit()
        top = tkinter.Toplevel(self.root)  # 创建弹出式窗口
        # font=字体,selectmode=是否用户可选择日期,locale=设置日期语言
        try:
            cal = Calendar(top, font="Arial 14", selectmode='day', locale='zh_CN')
            cal.pack(fill="both", expand=True)
            ttk.Button(top, text="ok", command=print_sel).pack()
            return str(cal.selection_get())
        except Exception as e:
            self.log_insert(str(e))

    def dp(self):
        '''可视化'''
        try:
            # 测试连接正常返回true
            if self.rs.ping():
                self.root = Tk()
                self.root.title('数据存储工具')  # 窗口标题
                self.root.geometry('350x450')  # 设置窗口大小


                Label(self.root, text="日期:").place(height=25, width=48, x=14, y=10)  # 标签
                self.default_value1 = StringVar()
                self.default_value1.set('可不选日历,默认为当前时间')
                self.E_time = Entry(self.root, state='readonly',fg='#DB7093', textvariable = self.default_value1)  # 时间输入框
                self.E_time.place(height = 25,width = 160,x = 61,y = 10)

                b1 = Button(self.root, text="日历", command=self.example1)
                b1.place(height=25, width=63, x=240, y=10)  # 选择按钮


                Label(self.root, text="用户名:").place(height = 25,width = 48,x = 14,y = 50)  # 标签
                self.E_name = Entry(self.root)  # 用户名输入框
                self.E_name.place(height = 25,width = 240,x = 61,y = 50)


                Label(self.root, text="数据:").place(height = 25,width = 48,x = 14,y = 90)  # 标签
                self.data = Entry(self.root)  # 数据输入框
                self.data.place(height = 25,width = 240,x = 61,y = 90)

                b = Button(self.root, text="查询", command=lambda :self.Hgetall(self.E_name.get(),self.E_time.get()),bg="SkyBlue")
                b.place(height = 25,width = 63,x = 60,y = 120) # 选择按钮

                c = Button(self.root, text="保存", command=lambda :self.Hsets(self.E_name.get(),self.data.get(),self.E_time.get()),bg='Pink')
                c.place(height = 25,width = 63,x = 240,y = 120)

                # 信息接收区
                Receive = LabelFrame(self.root, text="接收区", padx=10, pady=10)  # 水平,垂直方向上的边距均为 10
                Receive.place(x=20, y=150)
                self.Receive_Window = scrolledtext.ScrolledText(Receive, width=35, height=12, padx=10, pady=10, font=('微软雅黑', 9), wrap=WORD)
                self.Receive_Window.grid()

                c1 = Button(self.root, text="用户过期时间", command=lambda :self.Ttl(self.E_name.get()),bg='#FFD700',relief=GROOVE)
                c1.place(height=25, width=80, x=20, y=420)

                dl = Button(self.root, text="删除用户数据", command=lambda :self.Delete(self.E_name.get()),bg='#FFD700',relief=GROOVE)
                dl.place(height = 25,width = 80,x = 120,y = 420)

                dl1 = Button(self.root, text="清屏", command=lambda :self.log_dl(), bg='#90EE90', relief=GROOVE)
                dl1.place(height = 25,width = 63,x = 265,y = 420)

                self.log_insert('数据库连接正常...')

                self.root.mainloop()

        except Exception as e:
            tkinter.messagebox.showinfo('提示', str(e))


if __name__ == '__main__':

    rd = radis_sever()  # 实例化
    rd.dp() # 执行可视化

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

黑泽心教 发表于 2021-4-19 18:41
学习了!
茫茫狐 发表于 2021-4-19 20:36
bandishui 发表于 2021-4-20 09:42
L__ 发表于 2021-4-20 09:56
谢谢分享,python好语言
zhangbice 发表于 2021-4-20 11:50
谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 18:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表