我正在用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强?它目前对我有效。:)
x
和y
指定要设置的窗口的新坐标。当对窗口调用SetWindowPos
函数时,我希望它保持在当前位置。唉,我找不到一种方法可以轻松地将当前窗口(x,y)位置传递到函数中。我找到了一个解决办法,但假设我不应该在这个问题上引入一个新的话题。
0, 0,
应该指定窗口的新宽度和高度(以像素为单位)。好吧,这个功能已经在pygame.display.set_mode()
函数中了,所以我把它们留在0。0x0001
忽略这些参数。
0x0001
对应于SWP-NOSIZE,是我唯一的uFlag。所有可用uflag的列表都在提供的文档页上。它们的一些十六进制表示如下:
应该是这样!希望对你有用!
感谢John Popplewell在John@johnypops.demon.co.uk的帮助。
问题更像是你在使用哪个窗口工具包?PyGTK和受过类似教育的谷歌给了我this:
如前所述,是否尊重此设置取决于窗口管理器。
编辑为包含特定于SDL的内容 Pygame使用SDL来完成显示工作,但显然不能很好地处理Windowing toolkits。SDL窗口可以放在上面讨论here。
我真的一点也不懂Python,但通过谷歌搜索“pygtk总是在上面”,我得到了这样的信息:
http://www.mail-archive.com/pygtk@daa.com.au/msg01370.html
发布的解决方案是:
您可能还想搜索“x11总是在最上面”之类的内容。基本的概念似乎是,您给窗口管理器一个“提示”,它应该保持窗口高于其他窗口。然而,窗口管理器拥有自由支配权,可以随心所欲。
在使用Fluxbox这样的窗口管理器时,我也看到了层的概念,所以也许有一种方法可以改变窗口出现的层。
我试图找出一个类似的问题,并使用Pmw模块找到了这个解决方案
http://www.java2s.com/Code/Python/GUI-Pmw/Showglobalmodaldialog.htm
相关问题 更多 >
编程相关推荐