You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pyglet中通过编程恢复已最小化的窗口?

如何在pyglet中编程恢复最小化的窗口

目前pyglet官方确实没有提供直接恢复最小化窗口的内置方法,但无需修改源码,通过调用对应平台的原生API即可实现,以下是不同平台的可行方案:

针对单平台的实现

Windows平台

直接利用窗口的原生句柄_hwnd,调用Windows API的ShowWindow函数恢复窗口:

import pyglet
import ctypes

# 加载user32库并定义常量
user32 = ctypes.WinDLL('user32', use_last_error=True)
SW_RESTORE = 9

# 创建窗口并最小化
window = pyglet.window.Window()
window.minimize()

# 恢复窗口
user32.ShowWindow(window._hwnd, SW_RESTORE)

pyglet.app.run()

Linux(X11)平台

通过X11的XMapRaised函数恢复并激活窗口,利用pyglet窗口暴露的_xdisplay和_xwindow句柄:

import pyglet
from ctypes import cdll

# 加载X11库
xlib = cdll.LoadLibrary('libX11.so.6')

window = pyglet.window.Window()
window.minimize()

# 恢复窗口
xlib.XMapRaised(window._xdisplay, window._xwindow)

pyglet.app.run()

macOS平台

调用Quartz框架的API,利用窗口的_ns_window属性(对应NSWindow实例):

import pyglet
import ctypes

# 加载Quartz框架
quartz = ctypes.CDLL('/System/Library/Frameworks/Quartz.framework/Quartz')

window = pyglet.window.Window()
window.minimize()

# 恢复并激活窗口
quartz.NSWindow_makeKeyAndOrderFront(window._ns_window, None)

pyglet.app.run()

跨平台通用封装

可以封装一个跨平台的恢复函数,甚至直接给pyglet.window.Window类动态添加restore方法,避免重复代码:

import pyglet
import sys

def _restore_win32(window):
    import ctypes
    user32 = ctypes.WinDLL('user32', use_last_error=True)
    user32.ShowWindow(window._hwnd, 9)  # SW_RESTORE = 9

def _restore_linux(window):
    from ctypes import cdll
    xlib = cdll.LoadLibrary('libX11.so.6')
    xlib.XMapRaised(window._xdisplay, window._xwindow)

def _restore_macos(window):
    import ctypes
    quartz = ctypes.CDLL('/System/Library/Frameworks/Quartz.framework/Quartz')
    quartz.NSWindow_makeKeyAndOrderFront(window._ns_window, None)

def restore_window(window):
    platform = sys.platform
    if platform == 'win32':
        _restore_win32(window)
    elif platform.startswith('linux'):
        _restore_linux(window)
    elif platform == 'darwin':
        _restore_macos(window)

# 给Window类添加restore方法
pyglet.window.Window.restore = lambda self: restore_window(self)

# 使用示例
window = pyglet.window.Window()
window.minimize()
window.restore()  # 直接调用新增的restore方法

pyglet.app.run()

这种方式完全不需要修改pyglet的源码,仅在自己的项目代码中实现即可,适配主流桌面平台,比早年修改源码的方案更灵活通用。

内容的提问来源于stack exchange,提问作者Raphael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:33:29