Tkinter Treeview展示SQLite数据时如何对指定列部分字符脱敏
实现方案
完全可以实现该需求,不需要修改数据库存储的原始数据,也不需要依赖Treeview的特殊支持,仅需在数据插入Treeview前对NRIC字段做字符串脱敏处理即可,两种常用实现方式如下:
方案1:Python层处理(推荐,灵活性更高)
修改view_database()函数的插入逻辑,对NRIC字段脱敏后再传入Treeview,同时支持保留原始NRIC值供后续业务逻辑使用:
def view_database(): # 先清空Treeview原有数据,避免重复插入 for item in my_tree.get_children(): my_tree.delete(item) connectpatient = sqlite3.connect('patient_database.db') #Create Cursor - Link to database c = connectpatient.cursor() #Query the Database c.execute("SELECT *, oid FROM patient_list") records = c.fetchall() for record in records: # 提取原始NRIC值 original_nric = record[0] # 前5位脱敏处理 if len(original_nric) >= 5: masked_nric = '*'*5 + original_nric[5:] else: # 若NRIC长度不足5位则全部脱敏 masked_nric = '*'*len(original_nric) # 构造脱敏后的行数据 masked_record = (masked_nric,) + record[1:] # 插入Treeview,可将原始NRIC存入tags供双击等事件调用 my_tree.insert("", tk.END, values=masked_record, tags=(original_nric,)) # 原代码中my_tree.pack()放在循环内是冗余的,初始化Treeview时调用一次即可 my_tree.pack() #Commit Changes connectpatient.commit() #Close Connection connectpatient.close()
如果后续双击事件需要获取原始NRIC值,可以直接从tags中读取:
def display_selection(event): selected = my_tree.selection()[0] # 读取原始NRIC original_nric = my_tree.item(selected, 'tags')[0] # 其他业务逻辑
方案2:SQL查询层处理
直接在SQL查询时完成脱敏,无需修改Python循环逻辑,适合需要全局统一脱敏规则的场景:
c.execute("SELECT '*****' || SUBSTR(nric, 6) AS nric, full_name, age, gender, ethnic, oid FROM patient_list")
查询结果直接插入Treeview即可,无需额外处理。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

