如何使python窗口运行为“始终在最前面”?

我在python中运行一个小程序,它启动一个小窗口,需要保留在所有其他窗口之上。 我相信这是特定于操作系统的,GNU-Linux在GNOME中是如何完成的?

[ 更新 – Windows解决scheme ]

很可爱,我觉得我的工作。 我在64位的Vista上使用Pygame 1.9.1中的Python 2.5.4。 因此,这是Windows系统。 SetWindowPos函数logging在这里 。 我将在我的解释中提到这一点。

import:

 from ctypes import windll 

然后我build立一个variables,在user32中调用“SetWindowPos”:

 SetWindowPos = windll.user32.SetWindowPos 

现在,让我们说,我只是做了一个窗口:

 screen = pygame.display.set_mode((100,100), pygame.NOFRAME) 

下一行是关键。 这将窗口设置在其他窗口之上。

 SetWindowPos(pygame.display.get_wm_info()['window'], -1, x, y, 0, 0, 0x0001) 

基本上,您提供的hWnd (窗口句柄)的窗口ID是从调用display.get_wm_info() 。 现在该function可以编辑刚刚初始化的窗口。

-1是我们的hWndInsertAfter

MSDN网站说:

通过将hWndInsertAfter参数设置为HWND_TOPMOST并确保未设置SWP_NOZORDER标志,或者通过在Z顺序中设置窗口的位置,使窗口位于任何现有的最顶层窗口之上,可以使窗口成为最上层的窗口。 当一个非最顶层的窗口是最顶层的时候,它所拥有的窗口也是最顶层的。 它的主人却没有改变。

所以, -1确保窗口高于任何其他现有的最高层窗口,但是这可能不适用于所有情况。 也许-2击败-1? 目前它适用于我。 🙂

xy为正在设置的窗口指定新的坐标。 当我们调用SetWindowPos函数时,我希望窗口保持在当前位置。 唉,我找不到方法轻松地将当前窗口(x,y)的位置传递给函数。 我能够find解决办法,但假设我不应该在这个问题上引入新的话题。

0, 0,应该指定窗口的新的宽度和高度,以像素为单位。 那么,这个function已经在你的pygame.display.set_mode()函数中了,所以我把它们留在了0. 0x0001忽略了这些参数。

0x0001对应于SWP_NOSIZE,是我唯一的uFlag。 提供的文档页面上列出了所有可用的uFlags。 他们的一些Hex表示如下:

  • SWP_NOSIZE = 0x0001
  • SWP_NOMOVE = 0x0002
  • SWP_NOZORDER = 0x0004
  • SWP_NOREDRAW = 0x0008
  • SWP_NOACTIVATE = 0x0010
  • SWP_FRAMECHANGED = 0x0020
  • SWP_SHOWWINDOW = 0x0040
  • SWP_HIDEWINDOW = 0x0080
  • SWP_NOCOPYBITS = 0x0100
  • SWP_NOOWNERZORDER = 0x0200
  • SWP_NOSENDCHANGING = 0x0400

应该是这样! 希望对你有帮助!

感谢John Popplewell的john@johnnypops.demon.co.uk的帮助。

Solutions Collecting From Web of "如何使python窗口运行为“始终在最前面”?"

这个问题更像是你在使用哪个窗口工具箱? PyGTK和类似的受过教育的谷歌搜索给了我这个 :

 gtk.Window.set_keep_above 

如前所述,窗口管理员要尊重这个设置。

编辑包括SDL特定的东西 Pygame使用SDL做显示工作,并且熟练地使用Windowing工具包来玩。 这里讨论SDL窗口可以放在上面。

我真的不知道太多的Python,但谷歌搜索“pygtk总是在上面”给了我这个:

http://www.mail-archive.com/pygtk@daa.com.au/msg01370.html

在那里发布的解决方案是:

 transient.set_transient_for(main_window) 

你可能也想搜索一些像“x11总是在最前面”的东西。 基本的概念似乎是,你给窗口管理器一个“提示”,它应该保持窗口上面的其他人。 然而,窗口管理员有自由的统治,可以做任何想做的事情。

当使用像Fluxbox这样的窗口管理器时,我也看到了图层的概念,所以也许有办法改变窗口出现的图层。

我试图找出一个类似的问题,并发现这个解决方案使用Pmw模块

http://www.java2s.com/Code/Python/GUI-Pmw/Showglobalmodaldialog.htm