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

Tkinter应用重启后my_tree数据显示格式异常问题求助

问题解决:Tkinter重启后Treeview数据显示异常

问题现象

在Tkinter应用中添加数据(如Michael)时,Treeview(my_tree)显示正常,但关闭并重启应用后,数据显示异常——例如lastname字段变成逗号,还出现多余引号。

问题根源

  1. 数据库字段类型选择错误:使用CHAR(50)存储firstname和lastname,该类型会自动将不足50字符的内容用空格补全。从数据库读取时,这些末尾空格会导致Treeview渲染格式错乱,甚至被误解析为分隔符或多余符号。
  2. 数据读取未处理冗余内容:未对读取到的CHAR类型数据做空格清理,进一步加剧显示异常。

解决方案

方案1:修改数据库字段类型(根治)

将CHAR(50)改为VARCHAR(50),VARCHAR是可变长度类型,不会自动补空格,更适合存储姓名这类长度不固定的文本。

修改表结构创建代码:

# 修改字段类型为VARCHAR(50)
columns = [
    ('stud_id', 'INT', 'PRIMARY KEY' ),
    ('firstname', 'VARCHAR(50)', 'NOT NULL'),
    ('lastname', 'VARCHAR(50)', 'NOT NULL'),
    ('adress', 'VARCHAR(100)', 'NOT NULL')
]

如果表已存在,可执行ALTER语句修改字段类型(添加到表存在的分支中):

else:
    print(f"Table '{table_name}' already exists.")
    # 可选:修改现有表的字段类型
    try:
        cursor.execute(f"ALTER TABLE {schema}.{table_name} ALTER COLUMN firstname VARCHAR(50) NOT NULL")
        cursor.execute(f"ALTER TABLE {schema}.{table_name} ALTER COLUMN lastname VARCHAR(50) NOT NULL")
        conn.commit()
        print("已将firstname和lastname字段类型更新为VARCHAR(50)")
    except Exception as e:
        print(f"更新字段类型失败:{str(e)}")

方案2:读取数据时清理空格(兼容旧数据)

如果无法修改现有表结构,在load_data函数中对读取到的字符串字段做首尾空格清理:

def load_data():
    query = f"SELECT stud_id, firstname, lastname, adress FROM {table_name}"
    cursor.execute(query)
    rows = cursor.fetchall()

    for row in rows:
        # 清理每个字符串字段的首尾空格
        studid = row[0]
        fname = row[1].strip() if isinstance(row[1], str) else row[1]
        lname = row[2].strip() if isinstance(row[2], str) else row[2]
        adress = row[3].strip() if isinstance(row[3], str) else row[3]
        my_tree.insert("", "end", values=(studid, fname, lname, adress))

效果验证

修改后,添加数据并重启应用,Treeview中的数据显示将和添加时保持一致,不会出现格式错乱问题。

内容的提问来源于stack exchange,提问作者magocode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:07:46