使用Python+PySimpleGUI实现路径转Excel时触发TypeError问题排查
问题分析
- 核心错误原因:
window.read()返回的是(事件名, 输入值字典)的元组,你直接将这个元组赋值给了values变量,导致后续用字符串'-INF1-'索引元组时触发TypeError——元组只能用整数或切片索引。 - 额外逻辑错误:
- 路径是字符串类型,你错误地用
int()转换用户输入的路径,这会直接导致路径处理失败。 - 在窗口交互循环前就调用了
list_files(path),此时用户还未输入任何路径,程序会直接报错。 - 窗口循环内的
event = window.read()同样没有正确解构返回值,会导致事件判断逻辑失效。
- 路径是字符串类型,你错误地用
修正后的代码
import PySimpleGUI as sg import ctypes import platform import os import pandas as pd from pathlib import Path from docxtpl import DocxTemplate def make_dpi_aware(): if int(platform.release()) >= 8: ctypes.windll.shcore.SetProcessDpiAwareness(True) make_dpi_aware() sg.LOOK_AND_FEEL_TABLE['MyCreatedTheme'] = {'BACKGROUND': '#DCD7C9', 'TEXT': '#000000', 'INPUT': '#E9DAC1', 'TEXT_INPUT': '#000000', 'SCROLL': '#99CC99', 'BUTTON': ('#000000', '#54BAB9'), 'PROGRESS': ('#D1826B', '#CC8019'), 'BORDER': 1, 'SLIDER_DEPTH': 0, 'PROGRESS_DEPTH': 0, } sg.theme('MyCreatedTheme') layout = [ [sg.T('Voer een pad in: '), sg.Input(key='-INF1-')], [sg.FolderBrowse('Opslaan in', key="-IN-")], [sg.Button("Open excel bestand"), sg.Exit()] ] window = sg.Window('Pad naar excel generator', layout, element_justification="right", modal=True, font='Any 12') def list_files(path): files = [] for r, d, f in os.walk(path): for file in f: files.append(os.path.join(r, file)) df = pd.DataFrame(files, columns = ['path']) df['filename'] = df['path'].str.split('\\').str[-1] df['path'] = df['path'].str.replace(r'\\[^\\]*$', '') df.to_excel('files.xlsx', index = False) return df while True: # 正确解构read()返回的事件和值字典 event, values = window.read() if event == sg.WIN_CLOSED or event == "Exit": break if event == "Open excel bestand": # 直接使用输入的路径字符串,无需转int input_path = values['-INF1-'] if not input_path: sg.popup("请先输入路径!") continue # 调用文件列表生成函数 list_files(input_path) # 处理docx部分:注意如果output_path不存在,DocxTemplate会报错,这里可以加判断 output_folder = values["-IN-"] if not output_folder: sg.popup("请先选择保存文件夹!") continue output_path = Path(output_folder) / "filestopath.docx" # 如果你是要创建新的docx,可能需要先加载一个空白模板,或者调整逻辑 # 这里假设你已有模板文件,否则需要修改 try: doc = DocxTemplate(output_path) doc.save(output_path) os.startfile(output_path) except FileNotFoundError: sg.popup("指定的docx模板不存在!") window.close()
关键修正点
- 将
window.read()的返回值正确解构为event和values两个变量,values才是存储输入值的字典。 - 移除了窗口循环前的无效代码,确保逻辑在用户触发事件后才执行。
- 去掉了路径转
int的错误操作,直接使用用户输入的字符串路径。 - 添加了输入为空的判断,避免空路径导致的报错。
内容的提问来源于stack exchange,提问作者Bosbes
相关产品推荐
相关产品推荐

