我正在尝试使用
filedialog.asksavefilename
来获取保存文件路径。我在 IDLE shell 中运行此代码,它是一个基于文本的界面。这是获取保存路径的函数:
def getPath():
root=tk.Tk()
root.lift()
root.attributes('-topmost',True)
root.after_idle(root.attributes,'-topmost',False)
path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=(("Text Documents", "*.txt"),))
root.destroy()
对话框在其他窗口后面打开,因此我使用 this 使对话框出现在前面。这可行,但后面仍然有一个我不想要的空窗口。我尝试过使用
root.withdraw()
但这只是隐藏了一切。我只想打开文件对话框,而不打开空的 tk 窗口。关于如何做到这一点有什么想法吗?
我找到了达到预期效果的方法:
def getPath():
root=tk.Tk()
root.overrideredirect(True)
root.attributes("-alpha", 0)
path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=(("Text Documents", "*.txt"),))
root.destroy()
我删除了所有不必要的
lift
和 topmost
部分 - 它们没有帮助。我使用 root.overrideredirect(True)
删除了标题栏,并使用 root.attributes("-alpha", 0)
使窗口 100% 透明,这样你就看不到它了。唯一的缺点是文件对话框窗口打开时会闪烁,但这并不是什么大问题。
我有完全相同的要求,即使用控制台应用程序或脚本而不是 GUI 中的一些 tkinter.filedialog 函数。我对如何实现它的所有搜索都找到了涉及创建临时 tkinter 根窗口并在使用对话框后销毁它的答案。多年来我一直使用这样的解决方案,但总是对它产生的滞后感到恼火(有时,随机地,相当长)。
我最近发现你只需要调用对话框功能 - 不需要讨厌的根窗口!
from tkinter import filedialog
def getPath(): # now barely worth writing as a function!
path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=(("Text Documents", "*.txt"),))
return path
print(getPath())
这对我来说对 filedialog.askopenfilename、filedialog.askdirectory 等很有用,而且没有烦人的滞后。如果我早点看到这样的答案就好了!
如果它不适用于您的系统/版本,请发表评论。
from tkinter import Tk
from tkinter.filedialog import asksaveasfilename
def get_path():
root = Tk()
root.withdraw()
path = asksaveasfilename()
root.destroy()
return(path)
print(get_path()) # to verify expected result
这是您正在寻找的行为吗?希望这有帮助。