如何让 Python 窗口以“始终在最前面”的方式运行?

2024-11-11 08:26:00
admin
原创
27
摘要:问题描述:我正在用 Python 运行一个小程序,它会启动一个小窗口,该窗口需要保持在所有其他窗口的顶部。我相信这是操作系统特有的,在 GNU-Linux 和 GNOME 中如何实现?[更新 - Windows 解决方案]太棒了,我想我让它工作了。我在 Vista 64 位 Eclipse 中使用 Pytho...

问题描述:

我正在用 Python 运行一个小程序,它会启动一个小窗口,该窗口需要保持在所有其他窗口的顶部。我相信这是操作系统特有的,在 GNU-Linux 和 GNOME 中如何实现?

[更新 - 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(窗口句柄) 提供调用 返回的窗口 ID display.get_wm_info()。现在该函数可以编辑您刚刚初始化的窗口。

-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 的列表位于提供的文档页面上。它们的一些十六进制表示如下:

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


解决方案 1:

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


gtk.Window.set_keep_above

正如前面提到的,是否尊重此设置取决于窗口管理器。

编辑以包含 SDL 特定内容Pygame 使用 SDL 进行显示工作,但显然与窗口工具包
配合不佳。此处讨论了可以放在顶部的 SDL 窗口。

解决方案 2:

我确实不太了解 Python,但谷歌搜索“pygtk always on top”给了我这个:

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

那里发布的解决方案是:

transient.set_transient_for(main_window)

您可能还想搜索“x11 始终在最上面”之类的内容。其基本概念似乎是您向窗口管理器发出“提示”,让其将该窗口保持在其他窗口之上。但是,窗口管理器可以自由地做任何它想做的事情。

在使用 Fluxbox 之类的窗口管理器时,我也看到了层的概念,因此也许有办法改变窗口出现的层。

解决方案 3:

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

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用