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

PySimpleGUI开发录入界面无法按键值生成表格列问题咨询

问题定位

你代码里的报错和列生成异常来自三个明确问题:

  • 从未定义df这个DataFrame对象,直接调用df.to_csv()属于未定义变量的语法错误
  • 提取了columns和rows变量后,没有用这两个参数构造DataFrame,写入逻辑和读取的输入数据完全没有关联
  • 追加写csv时没有做表头写入判断,且直接取values.keys()作为列名在Python3.7以下版本中会出现顺序错乱,导致列和数据不匹配

关于你问的实现方式:不需要做复杂的表格列绑定,也不需要冗余存储列名和行数据,只要在写入前正确构造DataFrame、处理好表头逻辑即可。如果后续要在GUI里加Table控件展示数据,直接把提前定义好的列列表传给Table的headings参数就行。


原问题代码
from PySimpleGUI import PySimpleGUI as sg
import pandas as pd

# Layout
sg.theme('Reddit')
layout = [
    [sg.Text('Ticker: '), sg.Input(key='Ticker')],
    [sg.Text('Quantidade de Papéis: '), sg.Input(key='Qtd_de_papeis')],
    [sg.Text('Valor: '), sg.Input(key='Valor_pago')],
    [sg.Text('Data:'), sg.Input(key='Data')],
    [sg.Button('Adicionar'), sg.Button('Cancelar')]
]
# Janela
window = sg.Window('Tela de Cadastro', layout)
# Ler os eventos


while True:
    events, values = window.read()
    if events == (sg.WIN_CLOSED, 'Cancelar'):
        break
    if events == 'Adicionar':
        columns = list(values.keys())
        rows = list(values.values())
        print(rows)
        print(columns)
        df.to_csv('registro.csv', sep=';', mode='a', index=False)
df_new = pd.read_csv('registro.csv', sep=';')
window.close()
print(df_new)

可直接运行的修复代码
from PySimpleGUI import PySimpleGUI as sg
import pandas as pd
import os

# 固定列顺序,避免字典无序导致列错位,后续GUI表格可直接复用该列表作为表头
FIXED_COLUMNS = ['Ticker', 'Qtd_de_papeis', 'Valor_pago', 'Data']
CSV_SAVE_PATH = 'registro.csv'

# 界面布局
sg.theme('Reddit')
layout = [
    [sg.Text('Ticker: '), sg.Input(key='Ticker')],
    [sg.Text('Quantidade de Papéis: '), sg.Input(key='Qtd_de_papeis')],
    [sg.Text('Valor: '), sg.Input(key='Valor_pago')],
    [sg.Text('Data:'), sg.Input(key='Data')],
    [sg.Button('Adicionar'), sg.Button('Cancelar')]
]

window = sg.Window('Tela de Cadastro', layout)

while True:
    event, values = window.read()
    if event in (sg.WIN_CLOSED, 'Cancelar'):
        break
    if event == 'Adicionar':
        # 按固定列顺序提取输入值,避免数据错位
        current_row = [values[col] for col in FIXED_COLUMNS]
        # 构造单行DataFrame
        df = pd.DataFrame([current_row], columns=FIXED_COLUMNS)
        # 判断文件是否存在,控制是否写入表头
        is_file_exist = os.path.exists(CSV_SAVE_PATH)
        df.to_csv(CSV_SAVE_PATH, sep=';', mode='a', index=False, header=not is_file_exist)

window.close()
# 读取文件验证写入结果
if os.path.exists(CSV_SAVE_PATH):
    df_new = pd.read_csv(CSV_SAVE_PATH, sep=';')
    print(df_new)

关键逻辑说明
  • 提前定义固定列列表,彻底解决不同Python版本下字典无序导致的列错位问题,后续如果要加GUI表格组件,直接把这个列表传给headings参数即可,不需要重复定义
  • 每次点击添加按钮时,按固定列顺序从输入值字典里取数,构造成符合Pandas要求的二维数据格式再生成DataFrame
  • 写入时通过文件存在状态控制header参数:第一次创建文件时写入列名,后续追加数据时跳过表头,避免重复插入列名导致csv结构混乱
  • 把窗口关闭逻辑放在csv读取操作之前,避免窗口线程阻塞影响文件读写

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:21:21