【发布时间】:2021-11-18 18:34:03
【问题描述】:
我一直在研究这个例子project。非常简明扼要,而且还有一个惊喜:保存文件对话框(标准桌面文件对话框,从 Chrome 打开)。
负责人代码:
src/html.py:
@app.post('/download')
def form_post(request: Request, num: int = Form(...), multiply_by_2: bool = Form(False), action: str = Form(...)):
if action == 'convert':
result = spell_number(num, multiply_by_2)
return templates.TemplateResponse('download.html', context={'request': request, 'result': result, 'num': num})
elif action == 'download':
# Requires aiofiles
result = spell_number(num, multiply_by_2)
filepath = save_to_text(result, num)
return FileResponse(filepath, media_type='application/octet-stream', filename='{}.txt'.format(num))
templates/download.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Sample Form</title>
</head>
<body>
<form method="post">
<input type="number" name="num" value="{{ num }}"/>
<input type="checkbox" id="multiply_by_2" name="multiply_by_2" value="True">
<label for="multiply_by_2">Multiply by 2 </label>
<input type="submit" name="action" value="convert">
<input type="submit" name="action" value="download">
</form>
<p>Result: {{ result }}</p>
</body>
</html>
我在FileResponse 的文件对话框 上看不到任何提示,更不用说弹出的保存文件对话框。顺便说一句,我也想要打开文件对话框。我试图研究它,但没有成功。
它是如何工作的?
UPD,让自己更清楚。
我正在玩这样的东西:
from tkinter import Tk
from tkinter.filedialog import askopenfilename
...
@app.post("/open")
def form_post(
request: Request,
action: str = Form("open"),
):
if action == "open":
root = Tk()
root.withdraw()
# ensure the file dialog pops to the top window
root.wm_attributes('-topmost', 1)
fname = askopenfilename(parent=root)
print(f"Chosen file: {fname}")
return templates.TemplateResponse("open.html", context={"request": request})
elif action == "save":
# Requires aiofiles
return FileResponse(
"templates/legacy/download.html",
media_type="text/html",
filename="download.html",
)
目前,按钮save 使用系统保存文件对话框,而按钮open 使用tkinter 的打开对话框。它会做,因为整个事情只是一个带有 Web UI 的应用程序。不过,它看起来和感觉有点荒谬。
有没有办法让浏览器为打开文件拨号提供服务?
【问题讨论】: