[英]How to make python window run as “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
然后我在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? 它目前适合我。 :)
x
和y
指定要设置的窗口的新坐标。 我希望窗口在调用SetWindowPos
函数时保持其当前位置。 唉,我找不到一种方法可以轻松地将当前窗口(x,y)位置传递到函数中。 我能够找到一个解决方案,但我想我不应该在这个问题中引入一个新主题。
0, 0,
应该指定窗口的新宽度和高度(以像素为单位)。 好吧,这个功能已经存在于你的pygame.display.set_mode()
函数中,所以我将它们保留为0. 0x0001
忽略这些参数。
0x0001
对应SWP_NOSIZE,是我唯一的uFlag。 所提供的文档页面上列出了所有可用的uFlag。 他们的一些十六进制表示如下:
那应该是它! 希望这对你有用!
感谢John Popplewell在john@johnnypops.demon.co.uk的帮助。
问题更像是你使用哪个窗口工具包? PyGTK的和受过教育的类似Google上搜寻给了我这个 :
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.