使用Pandas与Tkinter填充文本框后DataFrame数据重复问题
Pandas DataFrame出现重复输出,但Tkinter GUI显示正常
我用Pandas读取Excel数据,通过Tkinter将数据填充到文本框中,操作后发现DataFrame的数据出现重复,但GUI显示正常。
引发问题的代码片段
# Extract number of rows and columns n_rows = df.shape[0] n_cols = df.shape[1] # Initialize current_row with the total number of rows in the dataframe current_row = n_rows # Extracting columns from the data and creating text widget with some background color column_names = df.columns i=0 n_rows = df.shape[0] for j, col in enumerate(column_names): text = Text(window, width=20, height=1, font=('Arial', 10,'bold'), bg = "#9BC2E6") text.grid(row=i,column=j, sticky="ew") text.tag_configure("tag_name", justify='center') text.insert(INSERT, col) text.tag_add("tag_name", "1.0", "end") # adding all the other rows into the grid for i in range(n_rows): for j in range(n_cols): cell_text = Text(window, width=len(str(df.loc[i][j])), height=1, font=('Times', 8)) cell_text.grid(row=i+1,column=j, sticky="ew") cell_text.tag_configure("tag_name", justify='center') cell_text.insert(INSERT, df.loc[i][j]) cell_text.tag_add("tag_name", "1.0", "end") cells[(i,j)] = cell_text # create button widget and add it to the grid cell_button = Button(window, text="Copy Row", command=lambda row=i: copy_row(cells, n_cols, row)) cell_button.grid(row=i+1,column=n_cols)
数据对比
导入时的DataFrame
N° do item descricao do item quant lot fab val 0 P05542 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 37 MARROM LHR 40123257 CA 40872 BRACOL 3 123123 2005/05/02 2006/02/02 1 P05544 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 39 MARROM LHR 40123257 CA 40872 BRACOL 2 123 2005/02/02 2006/02/02 2 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 123 2005/02/02 2006/02/02 3 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 1234 2005/02/02 2006/02/02 4 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 1235 2005/02/02 2006/02/02
填充文本框后的DataFrame
N° do item descricao do item quant lot fab val 0 P05542 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 37 MARROM LHR 40123257 CA 40872 BRACOL 3 123123 2005/05/02 2006/02/02 1 P05544 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 39 MARROM LHR 40123257 CA 40872 BRACOL 2 123 2005/02/02 2006/02/02 2 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 123 2005/02/02 2006/02/02 3 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 1234 2005/02/02 2006/02/02 4 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 1235 2005/02/02 2006/02/02 N° do item descricao do item quant lot fab val 0 P05542 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 37 MARROM LHR 40123257 CA 40872 BRACOL 3 123123 2005/05/02 2006/02/02 1 P05544 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 39 MARROM LHR 40123257 CA 40872 BRACOL 2 123 2005/02/02 2006/02/02 2 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 123 2005/02/02 2006/02/02 3 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 1234 2005/02/02 2006/02/02 4 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 1235 2005/02/02 2006/02/02 N° do item descricao do item quant lot fab val 0 P05542 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 37 MARROM LHR 40123257 CA 40872 BRACOL 3 123123 2005/05/02 2006/02/02 1 P05544 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 39 MARROM LHR 40123257 CA 40872 BRACOL 2 123 2005/02/02 2006/02/02 2 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 123 2005/02/02 2006/02/02 3 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 1234 2005/02/02 2006/02/02 4 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 1235 2005/02/02 2006/02/02 N° do item descricao do item quant lot fab val 0 P05542 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 37 MARROM LHR 40123257 CA 40872 BRACOL 3 123123 2005/05/02 2006/02/02 1 P05544 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 39 MARROM LHR 40123257 CA 40872 BRACOL 2 123 2005/02/02 2006/02/02 2 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 123 2005/02/02 2006/02/02 3 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 1234 2005/02/02 2006/02/02 4 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 1235 2005/02/02 2006/02/02 N° do item descricao do item quant lot fab val 0 P05542 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 37 MARROM LHR 40123257 CA 40872 BRACOL 3 123123 2005/05/02 2006/02/02 1 P05544 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 39 MARROM LHR 40123257 CA 40872 BRACOL 2 123 2005/02/02 2006/02/02 2 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 123 2005/02/02 2006/02/02 3 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 1234 2005/02/02 2006/02/02 4 P05545 BOTINA HORIZON DACAR C CADARCO EM VAQUETA 40 MARROM LHR 40123257 CA 40872 BRACOL 5 1235 2005/02/02 2006/02/02
问题排查与修复
核心原因
你贴出的代码中没有直接修改DataFrame的逻辑,所以df本身不会被填充GUI的操作改变。出现重复输出的可能原因有两个:
- 打印df的代码被放在循环内部:比如你在
for i in range(n_rows)或for j in range(n_cols)循环里执行了print(df),导致循环多少次就打印多少次df,看起来像是df重复了,实际数据没有变化。 - 按钮创建逻辑错误导致误触发数据追加:当前按钮创建在列循环内部,每一行会生成
n_cols个按钮,若copy_row函数中有追加行到df的逻辑,误点击多次会导致df重复。
修复步骤
1. 修正按钮创建位置
把按钮创建代码移到列循环外部,每一行只生成一个按钮,避免重复创建和误触发:
# adding all the other rows into the grid for i in range(n_rows): for j in range(n_cols): cell_text = Text(window, width=len(str(df.loc[i][j])), height=1, font=('Times', 8)) cell_text.grid(row=i+1,column=j, sticky="ew") cell_text.tag_configure("tag_name", justify='center') cell_text.insert(INSERT, df.loc[i][j]) cell_text.tag_add("tag_name", "1.0", "end") cells[(i,j)] = cell_text # 每一行只创建一个按钮,移到列循环外 cell_button = Button(window, text="Copy Row", command=lambda row=i: copy_row(cells, n_cols, row)) cell_button.grid(row=i+1,column=n_cols)
2. 检查打印代码的位置
确保print(df)或类似输出df的代码只在填充GUI完成后执行一次,不要放在任何循环内部。
3. 验证df是否真的被修改
在填充GUI前后分别执行print(df.shape),如果前后形状都是(5,6),说明df本身没有变化,只是输出重复;如果形状变成(25,6),则需要检查copy_row函数的逻辑,确保只追加指定行,而非整个df。
内容的提问来源于stack exchange,提问作者Rrios
相关产品推荐
相关产品推荐

