Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将tkinter窗口置于其他窗口之上?_Python_Tkinter_Osx Lion_Pyobjc_Py2app - Fatal编程技术网

Python 如何将tkinter窗口置于其他窗口之上?

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

我将Python2与
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)