使用Python的shutil复制文件时遇PySimpleGUI键错误求助
解决PySimpleGUI中values['-FOUT-']键错误的方案
可能的错误原因及修复方法
1. 键名完全不匹配
PySimpleGUI的键是严格区分大小写和特殊符号的,检查窗口布局里输出目录控件的键,必须和'-FOUT-'完全一致——不能写成'-fout-'、'FOUT',也不能少写前后的横杠。
举个正确的布局示例:
layout = [ [sg.FolderBrowse('选输出目录', key='-FOUT-')], [sg.Button('开始复制')] ]
2. 提前访问values字典
一定要在调用window.read()之后,才能去取values里的键。要是你的复制代码写在window.read()之前,此时values字典还没被填充,肯定会报键不存在的错。
正确的代码流程应该是这样:
window = sg.Window('文件复制工具', layout) while True: event, values = window.read() if event == sg.WIN_CLOSED: break if event == '开始复制': # 这里才是访问values['-FOUT-']的正确时机 src_path = r'.\[PARS] Template Directory\PAR\test.xlsx' dest_path = os.path.join(values['-FOUT-'], 'file.xlsx') # 先做有效性检查 if os.path.exists(src_path) and values['-FOUT-']: shutil.copy2(src_path, dest_path) else: sg.popup('请选有效的输出目录,或检查源文件路径') window.close()
3. 控件没绑定对应键
要是你的输出目录选择控件(比如FolderBrowse)没设置key='-FOUT-',那values字典里根本不会有这个键。赶紧去布局里检查控件的key参数有没有正确设置。
4. 源文件路径的隐藏问题
你写的源路径r'.[PARS] Template Directory\PAR\test.xlsx'有语法问题:原始字符串里,当前目录的子文件夹应该用.\[PARS],而不是.[PARS]——后者会被Python解析成奇怪的文件名,导致找不到源文件。修正后的路径应该是:
src_path = r'.\[PARS] Template Directory\PAR\test.xlsx'
实用调试技巧
- 访问
values['-FOUT-']前,先打印values字典,直接确认里面有没有这个键,以及对应的值是什么:print(values) - 加个异常捕获,方便快速定位问题:
try: dest_path = os.path.join(values['-FOUT-'], 'file.xlsx') shutil.copy2(src_path, dest_path) except KeyError as e: sg.popup(f'键错误:{e},检查键名是否正确') except Exception as e: sg.popup(f'复制失败:{str(e)}')
内容的提问来源于stack exchange,提问作者Panda
相关产品推荐
相关产品推荐

