能否将集成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部署文件
- requirements.txt:列出所有依赖,包括PySimpleGUIWeb和你用到的其他库(比如pandas、openpyxl等),示例:
PySimpleGUIWeb>=4.39.0 gunicorn>=20.1.0 pandas>=2.0.0 openpyxl>=3.1.2
- Procfile:告诉Heroku怎么启动你的应用,内容就一行:
web: gunicorn main:web_app
(这里的main是你的Python文件名,比如main.py,web_app是PySimpleGUIWeb生成的WSGI应用对象)
- .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
相关产品推荐
相关产品推荐

