如何让tkinter窗口置顶?
我正在使用Python 2,配合Tkinter
和PyObjC
,然后用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()
这个命令,在其他情况下使用也没有问题。