如何使python窗口运行为“总是在上面”?

2024-06-01 00:38:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python运行一个小程序,该程序启动一个小窗口,该窗口需要位于所有其他窗口的顶部。我相信这是操作系统特有的,在GNULinux和GNOME中是如何实现的?

[更新-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)

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

-1是我们的hWndInsertAfter

MSDN网站说:

A window can be made a topmost window either by setting the hWndInsertAfter parameter to HWND_TOPMOST and ensuring that the SWP_NOZORDER flag is not set, or by setting a window's position in the Z order so that it is above any existing topmost windows. When a non-topmost window is made topmost, its owned windows are also made topmost. Its owners, however, are not changed.

因此,-1确保窗口高于任何其他现有的最顶层窗口,但这可能并不适用于所有情况。也许a-2比a-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@johnypops.demon.co.uk的帮助。


Tags: the函数程序iswindowsdisplaywindowpygame
3条回答

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


gtk.Window.set_keep_above

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

编辑为包含特定于SDL的内容 Pygame使用SDL来完成显示工作,但显然不能很好地处理Windowing toolkits。SDL窗口可以放在上面讨论here

我真的一点也不懂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

相关问题 更多 >