You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 23:36:04