Tkinter应用重启后my_tree数据显示格式异常问题求助
问题解决:Tkinter重启后Treeview数据显示异常
问题现象
在Tkinter应用中添加数据(如Michael)时,Treeview(my_tree)显示正常,但关闭并重启应用后,数据显示异常——例如lastname字段变成逗号,还出现多余引号。
问题根源
- 数据库字段类型选择错误:使用
CHAR(50)存储firstname和lastname,该类型会自动将不足50字符的内容用空格补全。从数据库读取时,这些末尾空格会导致Treeview渲染格式错乱,甚至被误解析为分隔符或多余符号。 - 数据读取未处理冗余内容:未对读取到的
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
相关产品推荐
相关产品推荐

