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
相关产品推荐
相关产品推荐

