运行 flask 作为子进程以启动 tkinter window

Running flask as a subprocess in order to start a tkinter window

我有一个应用程序,使用 python 3.7 和 flask,在本地 运行s。我想请用户(我自己)提供一个文件夹的路径。我知道如何在 运行 仅 python 时使用 tkinter,我知道如何将数据从烧瓶发送到 python 脚本等等,但我找不到方法 运行 tkinter 在这种情况下。

我知道 tkinter 应该 运行 在主线程 中,我已经尝试使用子进程来让 tkinter window作为主线程,flask 作为子进程。

目前,我正在启动我的脚本 main.py,它使用 subprocess.Popen() 将 flask 作为子进程启动。但即便如此,由于 tkinter window 是从烧瓶路线打开的,它显然不是主线程。我的主线程是一个循环,等待用户输入退出脚本并终止 flask.exe ...

@app.route('/getPath', methods=['GET', 'POST'])
def getPath():
    prompter = promptlib.Files()
    myPath = prompter.dir()
    return render_template('form.html', data={'path': myPath})

有没有办法实现这样的目标?即使用另一个模块替换 tkinter window,JavaScript 或任何允许用户浏览 windows 资源管理器到 select 路径的东西。

正如@aaron 所说,您想要 <input type="file">。然而,为了做到这一点,您需要有服务器端代码来处理这些数据。 Flask-WTForms 对此有所帮助。基本上,在您的代码中,您首先制作一个 class:

from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileRequired
class UploadFileClass(FlaskForm): # Create a class based on the FlaskForm base we imported earlier
    file = FileField("Select a file", validators=[FileRequired()]) # Now we create a file field. 
    # The first argument is the label, and the second one is any validators you may want
    # For more info on validators, see https://flask-wtf.readthedocs.io/en/1.0.x/form/#validation

现在,在您的路线中,允许 POST 个请求:

@app.route("/upload", methods=["GET", "POST"])
def route():
    ...

接下来,导入您的表单(最好在文件顶部)并添加代码以在路径中处理您的文件:

# ... in your route ...
form = UploadFileClass() # Make a new instance of the class

if form.validate_on_submit(): # If the form was successfully sent
    data = form.file.data # Get the data
    data.save("wherever") # Save the data

有关创建表单的更多信息,请参阅 Creating Forms section of the docs