如何让python窗口以“Always On Top”运行?

时间:2009-09-27 01:25:09

标签: python linux gnome pygame always-on-top

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

[更新 - Windows解决方案]

可爱,我觉得我搞定了。我在Vista 64位的Eclipse中使用Python 2.5.4和Pygame 1.9.1。因此,这适用于Windows系统。 SetWindowPos函数记录在案Here。我将在我的解释中提到这一点。

进口:

from ctypes import windll

然后我设置了一个在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(窗口句柄)提供从display.get_wm_info()调用返回的窗口ID。现在该函数可以编辑刚刚初始化的窗口。

-1是我们的hWndInsertAfter

MSDN网站说:

  

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

因此,-1确保窗口位于任何其他现有的最顶层窗口之上,但这可能不适用于所有情况。也许-2比一个-1?它目前适合我。 :)

xy指定要设置的窗口的新坐标。我希望窗口在调用SetWindowPos函数时保持其当前位置。唉,我找不到一种方法可以轻松地将当前窗口(x,y)位置传递到函数中。我能够找到一个解决方案,但我认为我不应该在这个问题中引入一个新主题。

0, 0,应该指定窗口的新宽度和高度(以像素为单位)。好吧,该功能已经在你的pygame.display.set_mode()函数中,所以我将它们保留为0. 0x0001忽略这些参数。

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

  • 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的帮助。

3 个答案:

答案 0 :(得分:9)

问题更像是你使用哪种窗口工具包? PyGTK和类似的受过教育的谷歌搜索给了我this


gtk.Window.set_keep_above

如前所述,窗口管理器是否尊重此设置。

编辑包含SDL特定内容 Pygame使用SDL进行显示工作,并且显然与Windowing toolkits不一致。可以将SDL窗口置于顶部,讨论here

答案 1 :(得分:0)

我真的不太了解Python,但谷歌搜索“pygtk总是在顶部”给了我这个:

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

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

transient.set_transient_for(main_window)

您可能还想搜索“x11始终在最顶层”之类的内容。潜在的概念似乎是你给窗口管理器一个“提示”,它应该保持窗口高于其他窗口。然而,窗口管理器具有自由的统治权,可以做任何想做的事情。

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

答案 2 :(得分:0)

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

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