如何使python窗口运行为"Always On Top"?

Mor*_*789 8 python linux pygame gnome always-on-top

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

[ 更新 - Windows解决方案 ]

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

进口:

from ctypes import windll
Run Code Online (Sandbox Code Playgroud)

然后我在user32中设置一个调用"SetWindowPos"的变量:

SetWindowPos = windll.user32.SetWindowPos
Run Code Online (Sandbox Code Playgroud)

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

screen = pygame.display.set_mode((100,100), pygame.NOFRAME)
Run Code Online (Sandbox Code Playgroud)

下一行是关键.这将窗口设置在其他窗口的顶部.

SetWindowPos(pygame.display.get_wm_info()['window'], -1, x, y, 0, 0, 0x0001)
Run Code Online (Sandbox Code Playgroud)

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

-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的帮助.

wha*_*ick 8

问题更像是你使用哪个窗口工具包?PyGTK的和受过教育的类似Google上搜寻给了我这个:


gtk.Window.set_keep_above
Run Code Online (Sandbox Code Playgroud)

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

编辑包含SDL特定的东西 Pygame使用SDL进行显示工作,并且显然不适合使用Windowing工具包.这里讨论SDL窗口可以放在上面.

  • 鉴于这个问题被标记为“pygame”,我认为他正在使用 pygame。 (2认同)