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

能否将集成Python脚本的PySimpleGUI应用部署至Heroku?PySimpleGUIWeb本地文件浏览按钮无响应问题求助

当然可行!不过得先解决你遇到的本地文件浏览问题,还要适配Heroku的云端环境——毕竟Heroku是运行在服务器上的Web平台,没法直接访问用户本地的文件系统,这也是你FileBrowse按钮失效的核心原因。下面给你一步步拆解解决方案:

一、先搞定文件浏览的Web适配问题

PySimpleGUI的sg.FileBrowse()是为桌面应用设计的,在Web环境下受浏览器安全限制,根本没法调用用户本地的文件选择器。你得把它换成Web端专用的文件上传组件:

把原来的代码片段:

[sg.Text('Text2:'), sg.Input(), sg.FileBrowse()],
[sg.Text('Text3'), sg.Input(), sg.FileBrowse()],
[sg.Text('Text4'), sg.Input(), sg.FileBrowse()],

改成:

[sg.Text('Text2:'), sg.Input(key='-FILE1-'), sg.FileUpload(target='-FILE1-')],
[sg.Text('Text3'), sg.Input(key='-FILE2-'), sg.FileUpload(target='-FILE2-')],
[sg.Text('Text4'), sg.Input(key='-FILE3-'), sg.FileUpload(target='-FILE3-')],

这样用户点击FileUpload按钮时,会触发浏览器自带的文件选择对话框,选择的文件会自动上传到Heroku服务器的临时存储目录。之后你在Procesar事件里获取的values['-FILE1-']就是服务器上的文件路径,直接传给generar_propuestas就行。

二、调整代码适配Web应用模式

桌面版的PySimpleGUI用window.Read()循环监听事件,但Web版需要把窗口转换成WSGI应用,才能在Heroku上运行。修改你的主程序部分:

import os
import PySimpleGUIWeb as sg  # 注意这里要导入PySimpleGUIWeb,不是PySimpleGUI

def generar_propuestas(path1, path2, path3):
    # 保留你的原有逻辑,注意读取的是服务器上的文件路径
    ...

def main():
    sg.theme('DarkTeal9')
    layout = [
        [sg.Text('Text1', font=("Calibri", 20))],
        [sg.Text(' ')],
        [sg.Text('Text2:'), sg.Input(key='-FILE1-'), sg.FileUpload(target='-FILE1-')],
        [sg.Text('Text3'), sg.Input(key='-FILE2-'), sg.FileUpload(target='-FILE2-')],
        [sg.Text('Text4'), sg.Input(key='-FILE3-'), sg.FileUpload(target='-FILE3-')],
        [sg.Button('Procesar', bind_return_key=True, use_ttk_buttons=True)],
        [sg.Text('Ventana de progreso:')],
        [sg.Output(size=(75,25), key='inputbox')],
        [sg.Text(' ')]]
    
    window = sg.Window('Programme', resizable=True).Layout(layout)

    while True:
        event, values = window.Read()
        if event is None:
            break
        if event == 'Procesar':
            path1 = values['-FILE1-']
            path2 = values['-FILE2-']
            path3 = values['-FILE3-']
            # 先检查用户是否选了所有文件
            if not all([path1, path2, path3]):
                print("Por favor, selecciona todos los archivos requeridos!")
                continue
            # 调用处理函数
            generar_propuestas(path1, path2, path3)
    
    window.close()

if __name__ == '__main__':
    # 启动Web应用,监听Heroku提供的端口(用环境变量获取)
    port = int(os.environ.get('PORT', 5000))
    sg.start_web_app(main, port=port)
三、准备Heroku部署文件
  1. requirements.txt:列出所有依赖,包括PySimpleGUIWeb和你用到的其他库(比如pandas、openpyxl等),示例:
PySimpleGUIWeb>=4.39.0
gunicorn>=20.1.0
pandas>=2.0.0
openpyxl>=3.1.2
  1. Procfile:告诉Heroku怎么启动你的应用,内容就一行:
web: gunicorn main:web_app

(这里的main是你的Python文件名,比如main.py,web_app是PySimpleGUIWeb生成的WSGI应用对象)

  1. .gitignore:避免提交不必要的文件,内容:
__pycache__/
*.pyc
.env
四、部署到Heroku

按照以下步骤操作:

  • 初始化Git仓库:git init
  • 添加所有文件:git add .
  • 提交代码:git commit -m "Initial deploy to Heroku"
  • 创建Heroku应用:heroku create tu-nombre-de-app(替换成你的应用名)
  • 部署代码:git push heroku main
  • 打开应用:heroku open
几个关键提醒
  • 临时文件存储:Heroku的文件系统是临时的,用户上传的文件和你生成的结果文件,在应用重启后会消失。如果需要保存结果,建议集成云存储(比如AWS S3),或者让用户直接下载生成的文件。
  • 日志排查:如果部署后出现问题,用heroku logs --tail查看实时日志,很容易定位错误。
  • 依赖版本:确保requirements.txt里的版本兼容,避免部署时出现依赖冲突。

内容的提问来源于stack exchange,提问作者Alberto Martinez Lasheras

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:37:46