如何让tkinter窗口置顶?

37 投票
9 回答
68842 浏览
提问于 2025-04-17 09:20

我正在使用Python 2,配合TkinterPyObjC,然后用py2app来打包我的程序。

程序运行得很好,但每次打开程序时,窗口都是隐藏的,所以在我点击底部图标之前,它是不会显示出来的。

有没有办法控制这个,让窗口在程序启动时能够显示在其他已经打开的窗口上面呢?

为了更清楚一点,我并不是说窗口要一直在最上面,只需要在程序启动的时候能够显示在其他窗口上方就可以了。

9 个回答

29

我今天也遇到了同样的问题。我的操作系统是OSX LION 10.7.2。在mainloop()之前加上这段代码就解决了这个问题。

root.call('wm', 'attributes', '.', '-topmost', '1')

不过,这个窗口会一直在其他窗口上面,直到你把它关掉。要真正解决这个问题,我们需要把它做成一个应用程序包,使用py2app工具。

67

我知道这个问题已经很久了,但我觉得奇怪的是居然没有人想到我这个简单的解决办法。

app = SampleApp()

app.attributes('-topmost', True)
app.update()
app.attributes('-topmost', False)

app.mainloop()
15

如果我把你给的代码拿来,加上第一行和最后一行,你会得到:

from tkinter import *

root = Tk() 
root.title("app")
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
root.geometry("550x250+%d+%d" % (screen_width/2-275, screen_height/2-125))
root.configure(background='gold')
root.lift()

mainloop()

试试看。我得到的窗口是我预期的那样。你得到的是什么?如果这个能正常工作,那说明在你的代码里有某个地方让它这样做。如果它和你真正的程序表现一样,那可能是你的窗口管理器在起作用。没有更多信息的话,我也只能帮到这里。

补充:

在OSX系统上(特别是使用Aqua界面的版本),tkinter的窗口可能会显示在已经打开的窗口后面(这个问题在这里有个报告:http://bugs.python.org/issue9384,但已经关闭,表示不会修复)。为了在这种情况下把窗口放到最前面,加入了root.lift()这个命令,在其他情况下使用也没有问题。

撰写回答