Python 如何将tkinter窗口置于其他窗口之上?
我将Python2与Python 如何将tkinter窗口置于其他窗口之上?,python,tkinter,osx-lion,pyobjc,py2app,Python,Tkinter,Osx Lion,Pyobjc,Py2app,我将Python2与Tkinter和PyObjC一起使用,然后使用py2app 该程序运行正常,但每当我打开该程序时,该窗口都会以隐藏状态启动,因此在我单击dock上的图标将其打开之前,该窗口不会出现 有没有办法控制这一点,使窗口位于应用程序启动时打开的其他窗口之上 只是澄清一下,它不必在应用程序运行的整个过程中都处于顶部。我只需要它在启动时位于其他窗口的顶部。如果我接受您提供的代码并添加您得到的第一行和最后一行: from tkinter import * root = Tk() root
Tkinter
和PyObjC
一起使用,然后使用py2app
该程序运行正常,但每当我打开该程序时,该窗口都会以隐藏状态启动,因此在我单击dock上的图标将其打开之前,该窗口不会出现
有没有办法控制这一点,使窗口位于应用程序启动时打开的其他窗口之上
只是澄清一下,它不必在应用程序运行的整个过程中都处于顶部。我只需要它在启动时位于其他窗口的顶部。如果我接受您提供的代码并添加您得到的第一行和最后一行:
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的窗口可能显示在已经打开的窗口后面(这里有一个错误报告:但已经关闭,无法修复)。添加了
root.lift()
命令,以便在这些情况下将窗口置于堆栈的前面,而在所有其他情况下都是无害的。我今天也遇到了同样的问题。OSX LION 10.7.2。在mainloop()解决问题之前添加此代码
root.call('wm', 'attributes', '.', '-topmost', '1')
但在你关上窗户之前,窗户总是在其他窗户的上面。对于真正的解决方案,我们需要使用py2app将其作为应用程序包。我修改了上述解决方案,这两行代码在OSX上适用。它将窗口带到前面,但不会使窗口始终处于顶部
root.call('wm', 'attributes', '.', '-topmost', True)
root.after_idle(root.call, 'wm', 'attributes', '.', '-topmost', False)
对于OSX10.8.3,vdbuilder和user2435139提供的答案的组合为我带来了窍门,即
self.root.lift()
self.root.call('wm', 'attributes', '.', '-topmost', True)
self.root.after_idle(self.root.call, 'wm', 'attributes', '.', '-topmost', False)
以前打过电话
self.root.mainloop()
更多适用于mac OS用户。虽然上面的解决方案似乎显示正确,但从查找者的角度来看,应用程序仍然处于“堆栈的末尾”。可以通过Cmd+Tab
switcher看到这一点,或者简单地观察到python没有得到关注
解决方案(同样适用于mac OS):
也许可以用类似的东西来围绕它
import platform
if "Darwin" in platform.system():
# apply fix
如果有多个应用程序标题为“Python”的进程,则可能会出现问题;此外,它不适用于Python3进程(需要称为“Python3”)
但是,我发现使用进程id可以解决这个问题
import os
script = 'tell application "System Events" \
to set frontmost of the first process whose unix id is {pid} to true'.format(pid=os.getpid())
os.system("/usr/bin/osascript -e '{script}'".format(script=script))
我知道这是一个老问题,但我觉得奇怪的是,没有人提出我的简单解决方案
app = SampleApp()
app.attributes('-topmost', True)
app.update()
app.attributes('-topmost', False)
app.mainloop()
在我的例子中,如果没有update()
调用,窗口将不会在终端上方弹出。这就是最终工作的原因:
def raise_above_all(window):
window.attributes('-topmost', True)
window.update()
window.attributes('-topmost', False)
我解决了,因为我的代码有一个句号(“.”)在它的文件名中。当我从文件名中删除句点时,窗口显示在顶部,但我不确定它们之间的关系。无论如何,谢谢!事实上,现在它不再显示在顶部。我不知道为什么它会反复出现,但我猜窗口管理器出了问题,显然是因为它在我不使用e的情况下这样做了甚至改变代码中的任何内容。有没有办法用PyObjC强制窗口位于顶部?我一直在搜索它,但没有任何好的答案…@vdbuilderI我使用的是Lion(10.7.2)。我真的不明白我做错了什么,让应用程序不显示在前面;(@vdbuilderHmm..这是一个bug…我尝试了lift方法,但它没有打开我的窗口..我尝试了将它放置在不同的位置和/或多个位置,但出于某种原因它仍然无法将其放置在上面。非常感谢!@vdbuilderI在OS 10.6上也有同样的问题,并且没有使用PyObjC。实际上,使用此代码,使e其他提供的解决方案是多余的。虽然它们在其他平台上可能比OS X有更多的好处,但还没有尝试过。谢谢!不适用于Mac OS 10.11.2。您需要root.lift()
,如@jjaderberg的答案所示。这可能是最好的答案(在osx上也可以正常工作)。谢谢。这比我能找到的任何其他方法都有效。THX让窗口显示在顶部效果很好,但它看起来不对焦(直到我单击它)。如果我想让它在对焦状态下醒来,该怎么办?继续我上面的评论:我尝试了root.force_focus(),但没有成功。(可能force_focus仅适用于具有可输入字段的窗口???)这是唯一对我有效的解决方案(Win 7,Py 3.7)。@DanielGoldfarb这不是focus_force()
?这是OS X的最佳解决方案,它将窗口放在前面,并将其放在查找器列表的第一位(Cmd+Tab).你知道如何使它只在程序的所有其他窗口上(而不是在其他程序的窗口上)吗?
def raise_above_all(window):
window.attributes('-topmost', True)
window.update()
window.attributes('-topmost', False)