运行 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。
我有一个应用程序,使用 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。