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

使用Python+PySimpleGUI实现路径转Excel时触发TypeError问题排查

问题分析
  1. 核心错误原因:window.read()返回的是(事件名, 输入值字典)的元组,你直接将这个元组赋值给了values变量,导致后续用字符串'-INF1-'索引元组时触发TypeError——元组只能用整数或切片索引。
  2. 额外逻辑错误:
    • 路径是字符串类型,你错误地用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:50:23