如何使Tkinter的askopenfilename()在其他窗口之上打开?

13

我正在运行一个脚本,该脚本会提示用户选择文件。除了打开的文件浏览器之外,没有其他的GUI界面。我有两个选项:浏览文件或者使用askdirectory()选择整个文件夹。后者会在所有其他窗口的上方打开,但前者会在其他窗口下方打开,我必须最小化其他窗口才能找到它。

这是我用于进行这些操作的方法。

from Tkinter import Tk
from tkFileDialog import askdirectory, askopenfilename

root = Tk()
root.withdraw()

self.inpath = askdirectory()  # To open entire folder
Path = askopenfilename()      # Open single file

root.destroy()   # This is the very last line in my main script.

这是我代码中所有与Tk有关的内容。 askdirectory 会在最上层打开,而 askopenfilename 不会。

有没有办法强制让它在最上层打开呢?


这对我来说不会发生,至少仅使用上述代码不会。 - Anand S Kumar
5个回答

11

root.wm_attributes('-topmost', 1) 对我很有帮助。说实话,我在另一个SO线程中找到了它 :-).


5

我想分享以下代码在我的情况下表现出色。但是为了使其起作用,我不得不同时使用window.wm_attributes('-topmost',1)和window=parent,请参见下面:

import tkinter as tk
from tkinter import filedialog
window = tk.Tk()
window.wm_attributes('-topmost', 1)
window.withdraw()   # this supress the tk window

   filename = filedialog.askopenfilename(parent=window,
                                  initialdir="",
                                  title="Select A File",
                                  filetypes = (("Text files", "*.txt"), ("All files", "*")))
# Here, window.wm_attributes('-topmost', 1) and "parent=window" argument help open the dialog box on top of other windows

4
我遇到了同样的问题。 对我来说,这个方法有效:
file = filedialog.askopenfilename(parent=root)

因此,如果不取消注释root.attributes("-topmost", True),文件对话框将在toplevel窗口前显示。

2
我遇到了文件对话框窗口在当前窗口下方打开的问题,但是我无法使用您的代码(Python 2或3)重现这个问题。
以下是出现问题的最小示例(上下文为Windows 10,Python 3,在Idle中调用脚本,并注意`input`函数:
文件对话框打开在下面:
from tkinter import filedialog, Tk

root = Tk()
root.withdraw()
input("\nType anything> ")

file =  filedialog.askopenfilename()

要在顶部打开文件对话框,使用root.lift()root.attributes("-topmost", True)均可(但后者是特定于Windows)。
from tkinter import filedialog, Tk

root = Tk()
#root.attributes("-topmost", True) # this also works
root.lift()
root.withdraw()
input("\nType anything> ")

file =  filedialog.askopenfilename()

唯一对我有用的解决方案。不得不取消根.attributes("-topmost", True)的注释。 - aze45sq6d

0

我正在运行Python 3.x,因此代码有所不同,但两者在顶部都已打开。尝试给它焦点,它应该会置于顶部。

self.inpath.focus()

我不确定它是否能够工作,因为我无法重现这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接