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

PySimpleGUI中能否通过FileSaveAs创建新文件夹?

实现PySimpleGUI「另存为」时创建新文件夹的方案

方法1:利用原生对话框的内置功能

PySimpleGUI的FileSaveAs元素底层调用对应GUI框架的原生另存为对话框,在Windows、macOS和多数Linux桌面环境中,原生对话框本身就支持创建新文件夹:

  • Windows:对话框左侧有「新建文件夹」按钮,或右键空白处选「新建>文件夹」
  • macOS:对话框工具栏有「新建文件夹」按钮,或按Cmd+Shift+N
  • Linux(GTK):右键空白处选「新建文件夹」

如果你的FileSaveAs没显示该功能,检查是否设置了no_window=True这类禁用原生对话框的参数。正常使用示例代码如下:

import PySimpleGUI as sg

layout = [
    [sg.FileSaveAs('另存为', key='-SAVE-')],
    [sg.Button('确认'), sg.Button('退出')]
]

window = sg.Window('测试另存为', layout)

while True:
    event, values = window.read()
    if event in (sg.WIN_CLOSED, '退出'):
        break
    if event == '确认':
        save_path = values['-SAVE-']
        if save_path:
            with open(save_path, 'w') as f:
                f.write('测试内容')
            sg.popup('文件保存成功')

window.close()

方法2:手动拆分「选文件夹+输文件名」

如果原生对话框的新建文件夹功能不符合需求,可拆分流程:先通过FolderBrowse让用户选择或创建文件夹(该元素本身支持创建新文件夹),再输入文件名,最后拼接完整路径:

import PySimpleGUI as sg
import os

layout = [
    [sg.FolderBrowse('选择文件夹', key='-FOLDER-'), sg.Input(key='-FOLDER_PATH-')],
    [sg.Text('文件名:'), sg.Input(key='-FILENAME-')],
    [sg.Button('保存'), sg.Button('退出')]
]

window = sg.Window('自定义另存为', layout)

while True:
    event, values = window.read()
    if event in (sg.WIN_CLOSED, '退出'):
        break
    if event == '保存':
        folder = values['-FOLDER_PATH-']
        filename = values['-FILENAME-']
        if not folder or not filename:
            sg.popup('请选择文件夹并输入文件名')
            continue
        if not os.path.splitext(filename)[1]:
            filename += '.txt'
        save_path = os.path.join(folder, filename)
        with open(save_path, 'w') as f:
            f.write('自定义路径保存的内容')
        sg.popup('文件保存成功')

window.close()

注意事项

  • 方法1依赖系统原生对话框,兼容性最好,推荐优先使用
  • 方法2更灵活,可自定义文件名规则、文件夹创建逻辑等

内容的提问来源于stack exchange,提问作者dgrb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:50:23