Flask桌面应用程序文件选择器

时间:2014-05-21 06:07:36

标签: python python-2.7 flask

我正在尝试使用Flask为桌面应用程序构建GUI(即在本地运行的服务器上运行的Web应用程序与嵌入式浏览器捆绑在一起)。现在大多数情况似乎都有用,但我想添加一个文件选择器,以允许用户在他们的计算机上选择一个目录。我需要目录的完整路径,因此使用HTML / JavaScript打开对话框将不起作用(由于安全限制)。

我尝试做的是在页面上按下按钮时启动Tkinter文件对话框。问题是,虽然它似乎确实启动了某些东西,但该过程只是冻结(没有显示窗口)而且我被迫杀死它,之后页面重定向到'/ view_1_actions'并且我得到一个“错误代码:ERR_EMPTY_RESPONSE “错误(即Flask应用程序仅在我杀死看似对话窗口后崩溃)。

这是我的代码:

HTML:

<form action="/view_1_actions" method="post">
    <input type="submit" name="submit" value="Select"></input>
</form>

的Python:

from flask import Flask, request, redirect
from Tkinter import Tk
from tkFileDialog import askdirectory

@app.route('/view_1_actions', methods = ['POST'])
def view_1_actions():
    if request.form['submit'] == 'Select':
        Tk().withdraw()
        dirname = askdirectory()
    return redirect('/')

这是一个相当奇怪的场景,因为你通常不会在“服务器端”启动图形界面,但我的问题是是否有办法解决这个或我可以用来显示文件的替代解决方案选择器对话框(最好是每个操作系统的原生对话框)。

1 个答案:

答案 0 :(得分:2)

虽然我不确定进程是否冻结(可能是Tk和你用来绘制webview的库之间的冲突?)但是用户可能会无限期地延迟视图函数的响应(在理论上“一直”使用视图。

我建议将烧瓶视图功能启动/消息作为一个单独的线程,然后立即返回。 (使用对话框后面的任何背景。)另一个线程负责以本机操作系统方式执行对话框窗口,然后当用户选择某些内容并完成时,在内部发送另一个烧瓶请求,它将执行任何需要执行的操作使用所选文件。

我以前从未在桌面应用程序中做过这个,但是这个的一些变体(可能是一个单独的进程而不是一个单独的线程,但理论类似)是我喜欢在服务器上处理长时间运行的任务