zkkkkx_ 2024-05-03 12:39 采纳率: 0%
浏览 12

如何用python中的tkinter库实现数据脱敏?(相关搜索:小程序|登录页面|身份证号)

想用tkinter来完成一个数据脱敏小程序,先有一个登录页面,登录成功后到选择文件页面,有一个按钮“请选择你要脱敏的文件”,点击后用户进行Excel文件选择。之后跳转到主页面,主页面是读取的表头信息,一个个小按钮,点击可以选择单列操作或多列操作,之后选择脱敏方式和脱敏级数。

eg.我之前设置的表格是电信诈骗受害者名单,所以主页面有姓名、年龄、身份证号、手机号、银行卡号、被诈骗金额、邮箱几七个按钮,点击按钮,该页面出现相应的选择按钮,供选择加密方式,加密方式分别为替换、置乱、移位、增加噪声值、对称加密五种,点击姓名按钮只能出现替换选项,勾选后要弹出新弹窗,将姓名第二位以后替换为随机汉字;点击年龄按钮出现移位和增加噪声值两个选项,勾选后进行相应的脱敏处理并弹出新弹窗;点击年龄、身份证号、手机号、银行卡号、被诈骗金额五个按钮均能弹出置乱、移位、增加噪声值选项,勾选后进行相应操作,弹出新弹窗;点击邮箱按钮出现替换、置乱、移位、增加噪声值、对称加密选项,勾选后进行相应操作,弹出新弹窗。被脱敏后的数据相应新弹窗中显现,新弹窗还想有一个导出按钮,即点击后可以直接导出一个新的excel储存这些信息。
这些加密操作都可以有不同的脱敏级数,想设置多个k值供选择。

😭做了很久 因为自身能力有限 还不能完全实现相对复杂的操作 代码一直有点混乱😭😭

  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-05-03 13:06
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题:如何用tkinter实现一个数据脱敏小程序,具体包括哪些功能和流程,并给出示例代码? 回答: 一、程序功能
    1. 登录页面:用户输入用户名和密码登录,如果验证通过,跳转到选择文件页面,否则提示错误信息。
    2. 选择文件页面:用户点击“请选择你要脱敏的文件”按钮,打开文件选择对话框,选择Excel文件后跳转到主页面。
    3. 主页面:显示Excel表格的表头信息,每个信息对应一个按钮,点击按钮可以选择单列或多列操作,选择脱敏方式和脱敏级数。
    4. 加密方式:提供五种加密方式:替换、置乱、移位、增加噪声值、对称加密。具体应用可见下面的示例。
    5. 脱敏级数:提供多个k值供选择,用于不同的加密操作。
    6. 导出功能:在新弹窗中显示脱敏后的数据,用户可以点击“导出”按钮将数据导出到一个新的Excel文件中。 二、程序流程 以下为程序的大致流程:
    7. 打开登录窗口,用户输入用户名和密码,点击“登录”按钮。
    8. 如果用户名和密码不正确,提示错误信息;如果正确,关闭登录窗口,打开选择文件窗口。
    9. 用户点击“请选择你要脱敏的文件”按钮,打开文件选择对话框,选择Excel文件,点击“确定”按钮。
    10. 打开主窗口,将Excel表格的表头信息显示在窗口中,每个信息对应一个按钮。
    11. 用户点击按钮,弹出选择对话框,选择加密方式和级数,点击“确定”按钮。
    12. 对Excel表格的相应列数据进行脱敏处理,并在新弹窗中显示脱敏后的数据。
    13. 用户可以点击“导出”按钮将数据导出到一个新的Excel文件中。 示例代码如下:(注:本示例代码只涉及部分功能,实现效果可能与需求略有不同,仅供参考)
    import tkinter as tk
    import pandas as pd
    import numpy as np
    import openpyxl
    from tkinter.filedialog import askopenfile
    from tkinter import messagebox
    class LoginWindow(tk.Toplevel):
        def __init__(self, master):
            tk.Toplevel.__init__(self, master)
            self.title('登录')
            self.geometry('200x120')
            self.resizable(0, 0)
            tk.Label(self, text='用户名:').grid(row=0, column=0, padx=5, pady=5, sticky=tk.E)
            self.entry_user = tk.Entry(self)
            self.entry_user.grid(row=0, column=1, padx=5, pady=5)
            tk.Label(self, text='密码:').grid(row=1, column=0, padx=5, pady=5, sticky=tk.E)
            self.entry_password = tk.Entry(self, show='*')
            self.entry_password.grid(row=1, column=1, padx=5, pady=5)
            tk.Button(self, text='登录', command=self.verify).grid(row=2, column=0, padx=10, pady=10, sticky=tk.W)
        def verify(self):
            username = 'admin'
            password = '123456'
            if self.entry_user.get() == username and self.entry_password.get() == password:
                self.destroy()
            else:
                messagebox.showerror('错误', '用户名或密码错误!')
    class SelectFileWindow(tk.Toplevel):
        def __init__(self, master):
            tk.Toplevel.__init__(self, master)
            self.title('选择文件')
            self.geometry('300x100')
            self.resizable(0, 0)
            tk.Button(self, text='请选择你要脱敏的文件', command=self.select_file).grid(row=0, column=0, padx=10, pady=10)
        def select_file(self):
            file = askopenfile(mode='r', filetypes=[('Excel files', '*.xlsx')])
            if file is not None:
                self.master.file = file.name
                self.destroy()
    class MainWindow(tk.Toplevel):
        def __init__(self, master):
            tk.Toplevel.__init__(self, master)
            self.title('数据脱敏小程序')
            self.geometry('800x400')
            self.resizable(1, 1)
            self.file = self.master.file
            self.df = pd.read_excel(self.file)
            self.cols = self.df.columns.tolist()
            for i in range(len(self.cols)):
                tk.Button(self, text=self.cols[i], command=lambda col=self.cols[i]: self.select_operation(col))\
                    .grid(row=0, column=i, padx=5, pady=5)
        def select_operation(self, col):
            operation_window = tk.Toplevel(self)
            operation_window.title('选择操作')
            operation_window.geometry('300x200')
            operation_window.resizable(0, 0)
            tk.Label(operation_window, text='请选择加密方式:').grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)
            var_replace = tk.IntVar()
            tk.Checkbutton(operation_window, text='替换', variable=var_replace).grid(row=1, column=0, padx=5, pady=5)
            var_shuffle = tk.IntVar()
            tk.Checkbutton(operation_window, text='置乱', variable=var_shuffle).grid(row=2, column=0, padx=5, pady=5)
            var_shift = tk.IntVar()
            tk.Checkbutton(operation_window, text='移位', variable=var_shift).grid(row=3, column=0, padx=5, pady=5)
            var_add_noise = tk.IntVar()
            tk.Checkbutton(operation_window, text='增加噪声值', variable=var_add_noise).grid(row=4, column=0, padx=5, pady=5)
            var_symmetric = tk.IntVar()
            tk.Checkbutton(operation_window, text='对称加密', variable=var_symmetric).grid(row=5, column=0, padx=5, pady=5)
            tk.Label(operation_window, text='请选择脱敏级数:').grid(row=6, column=0, padx=5, pady=5, sticky=tk.W)
            k_var = tk.IntVar()
            k_var.set(1)
            tk.Radiobutton(operation_window, text='1', variable=k_var, value=1).grid(row=7, column=0, padx=5, pady=5)
            tk.Radiobutton(operation_window, text='2', variable=k_var, value=2).grid(row=8, column=0, padx=5, pady=5)
            tk.Radiobutton(operation_window, text='3', variable=k_var, value=3).grid(row=9, column=0, padx=5, pady=5)
            tk.Button(operation_window, text='确定', command=lambda: self.do_operation(col, var_replace.get(), var_shuffle.get(),
                                                                                       var_shift.get(), var_add_noise.get(),
                                                                                       var_symmetric.get(), k_var.get(),
                                                                                       operation_window)).\
                                                                                                grid(row=10, column=0, pady=10)
        def do_operation(self, col, replace, shuffle, shift, add_noise, symmetric, k, operation_window):
            series = self.df[col]
            if replace:
                series = self.replace(series, k)
            if shuffle:
                series = self.shuffle(series, k)
            if shift:
                series = self.shift(series, k)
            if add_noise:
                series = self.add_noise(series, k)
            if symmetric:
                series = self.symmetric(series, k)
            self.show_result(series, operation_window)
        def replace(self, series, k):
            np.random.seed(0)
            suffixes = [chr(np.random.randint(0x4e00, 0x9fbf)) * (len(x) - 1) for x in series.tolist()]
            return series.str.slice(stop=1) + pd.Series(suffixes)
        def shuffle(self, series, k):
            np.random.seed(0)
            return series.sample(frac=1).reset_index(drop=True)
        def shift(self, series, k):
            return series.apply(lambda x: str((int(x) + k) % 100) if x.isdigit() else x)
        def add_noise(self, series, k):
            np.random.seed(0)
            noise = pd.Series(np.random.normal(0, k / 10, len(series)))
            return series.astype(float) + noise
        def symmetric(self, series, k):
            return series.apply(lambda x: x[::-1])
        def show_result(self, series, operation_window):
            result_window = tk.Toplevel(self)
            result_window.title('脱敏结果')
            result_window.geometry('400x300')
            result_window.resizable(0, 0)
            tk.Label(result_window, text='脱敏结果:').grid(row=0, column=0, padx=5, pady=5)
            text = tk.Text(result_window, width=50, height=20, wrap='none')
            text.grid(row=1, column=0, padx=10, pady=10)
            scrollbar = tk.Scrollbar(result_window, orient=tk.HORIZONTAL, command=text.xview)
            scrollbar.grid(row=2, column=0, sticky='ew')
            text.configure(xscrollcommand=scrollbar.set)
            for x in series.tolist():
                text.insert('end', str(x) + ' ')
            tk.Button(result_window, text='导出', command=lambda: self.export_result(series)).grid(row=3, column=0, pady=10)
            operation_window.destroy()
        def export_result(self, series):
            new_file = 'result.xlsx'
            wb = openpyxl.Workbook()
            ws = wb.active
            ws.append([series.name])
            for x in series.tolist():
                ws.append([x])
            wb.save(new_file)
            messagebox.showinfo('提示', '导出成功!')
    class App(tk.Tk):
        def __init__(self):
            tk.Tk.__init__(self)
            self.withdraw()
            login_window = LoginWindow(self)
            if login_window.winfo_exists():
                self.mainloop()
            else:
                select_file_window = SelectFileWindow(self)
                if select_file_window.winfo_exists():
                    main_window = MainWindow(self)
                    main_window.mainloop()
                    
    if __name__ == '__main__':
        app = App()
    

    说明: 1. 程序中共有三个窗口:登录窗口(LoginWindow)、选择文件窗口(SelectFileWindow)和主窗口(MainWindow)。 2. 登录窗口中用户输入用户名和密码,点击“登录”按钮。如果用户名和密码不正确,弹出错误窗口;如果正确,关闭登录窗口,打开选择文件窗口。 3. 选择文件窗口中点击“请选择你要脱敏的文件”按钮后,弹出文件选择对话框,用户选择Excel文件。如果选择了文件,将文件路径保存在App类的属性self.file中。 4. 主窗口中将Excel表格的表头信息显示在窗口中,并为每个信息设置一个按钮。当用户点击某个按钮时,弹出选择对话框,用户可以选择加密方式和脱敏级数,并进行相应的脱敏处理。脱敏结果以文本框的形式在新窗口中显示,用户可以将结果导出到一个新的Excel文件中。 5. 具体的脱敏操作可见MainWindow类中的replace、shuffle、shift、add_noise和symmetric方法。 6. 示例代码使用了pandas和openpyxl库,需要先安装这些库才能运行。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月3日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见