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

使用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的操作改变。出现重复输出的可能原因有两个:

  1. 打印df的代码被放在循环内部:比如你在for i in range(n_rows)或for j in range(n_cols)循环里执行了print(df),导致循环多少次就打印多少次df,看起来像是df重复了,实际数据没有变化。
  2. 按钮创建逻辑错误导致误触发数据追加:当前按钮创建在列循环内部,每一行会生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:40:28