PySimpleGUI如何调用用户选择的Excel文件及实现output_num除8判断
PySimpleGUI多步骤BIN生成工具问题修复
问题根因与修复方法
1. 无法获取选中文件、加载数据失败
核心错误点:
- FileBrowse选中的文件路径会存在
values['-IN1-']中,当前代码硬编码写死打开"Use user chosen CSV"字符串,根本没有读取控件返回的路径 - 文件读取、BIN生成逻辑写在事件循环外、窗口关闭后才执行,且提前定义的16个
binFile全局变量从未被赋值,调用write()/close()会直接触发空对象报错 - FileBrowse控件仅配置了xlsx格式过滤,和提示文字里支持CSV的描述不符
- BIN文件关闭逻辑写在CSV行遍历循环内部,处理第一行数据后就会关闭文件句柄,后续写入直接报错
- 上一步/下一步按钮的key序号和布局索引不匹配,点击会出现跳步、索引越界问题
修复操作:
- 修改FileBrowse的文件类型配置:
sg.FileBrowse(file_types=(("Supported Files", "*.csv *.xlsx"), ("CSV File", "*.csv"), ("Excel File", "*.xlsx")))
- 不要硬编码16个独立的binFile全局变量,用列表存储文件句柄,避免重复代码
- 将BIN生成逻辑移动到事件循环内部,当用户点击最后一步确认(Layout3的Next按钮)时,再从
values字典读取所有输入参数执行生成:- 源文件路径取
values['-IN1-'] - 导出目录路径取
values['-IN2-']
- 源文件路径取
- 所有CSV行遍历完成后,再统一关闭所有打开的BIN文件句柄
- 修正所有Prev/Next按钮的key,和所属布局的索引保持一致,比如第i个布局的Prev按钮key为
Prev {i},Next按钮key为Next {i},避免跳步错误
2. 动态计算BIN文件生成数量
核心逻辑:1个BIN文件对应8个驱动位,驱动位数量除以8后向上取整就是需要生成的BIN文件数(不满8位也需要占用1个文件),比如9位驱动需要2个BIN文件,71位驱动需要9个BIN文件。
实现步骤:
- 当用户在Layout0点击Next时,先校验
values['-IN0-']输入是否为1-71之间的合法整数,不合法则弹出错误提示,不允许跳转到下一步 - 校验通过后将输入值存为全局变量
driver_bit_num,用整数运算计算需要的BIN文件数,无需引入额外库:
bin_file_count = (driver_bit_num + 7) // 8
- 调用
open_output_files()时传入计算得到的bin_file_count,同时拼接用户选择的导出目录,不要将文件存在脚本当前工作目录 - 逐行处理CSV数据时,按
bin_file_count循环截取对应位段、转字节写入对应BIN文件,替换掉原来硬编码byte1~byte16的冗余写法
其他注意事项
- Python内置的csv模块仅支持读取csv格式文件,如果需要支持xlsx格式,需要额外安装
pandas和openpyxl库读取Excel内容,否则选中xlsx文件会触发解析错误 - 当前
open_output_files()函数返回的文件句柄列表没有赋值给变量,后续无法调用写入方法,需要用变量接收返回的列表 - 处理位串时记得补0对齐,避免位长度不足时切片报错
内容的提问来源于stack exchange,提问作者WoohSteezy
相关产品推荐
相关产品推荐

