10

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

[更新 - Windows 解决方案]

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

进口:

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(Window Handle) 提供从调用返回的窗口 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。所有可用 uFlags 的列表都在提供的文档页面上。它们的一些十六进制表示如下:

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

4

3 回答 3

8

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


gtk.Window.set_keep_above

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

编辑以包含 SDL 特定的东西 Pygame 使用 SDL 来做显示工作,显然不能很好地与Windowing toolkits配合使用。SDL Window 可以放在上面讨论这里

于 2009-09-27T03:39:33.620 回答
0

我真的一点都不了解 Python,但是谷歌搜索“pygtk 总是在最前面”给了我这个:

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

那里发布的解决方案是:

transient.set_transient_for(main_window)

您可能还想搜索“x11 始终在顶部”之类的内容。基本概念似乎是您正在给窗口管理器一个“提示”,它应该将窗口保持在其他窗口之上。但是,窗口管理器可以自由支配,可以为所欲为。

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

于 2009-09-27T01:34:26.333 回答
0

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

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

于 2010-08-04T14:36:41.900 回答