如何在pygame中检测可调整大小的窗口状态并在Linux中取消最大化?

时间:2013-11-24 19:49:55

标签: python linux pygame

我有一个使用pygame在python中构建的应用程序,它首先显示一个设置大小的登录屏幕,该屏幕不是RESIZABLE,然后当用户登录游戏时,保存的设置被用于转换窗口大小。登录后窗口将变为RESIZABLE。如果用户注销,窗口将更改回初始大小而不使用RESIZABLE标志。只要用户从正常窗口注销,一切都会正常,但是当用户点击最大化按钮然后在某些发行版中注销时,窗口仍然保持最大化并且登录屏幕正在窗口的左上角绘制。 / p>

问题是,有没有办法检测窗口是否已经最大化,所以我可以在调整大小之前取消最大化?

我找不到任何可以帮助我在pygame文档或任何地方在线的东西。我找到了一种通过使用以下方式获得窗口“句柄”的方法:

pygame.display.get_wm_info()['window']

但不确定从哪里开始。

我设置尺寸的方式:

self.screen = pygame.display.set_mode((800, 480)) #login screen
self.screen = pygame.display.set_mode(user_saved_size, pygame.RESIZABLE) #game screen

1 个答案:

答案 0 :(得分:2)

get_wm_info()['wmwindow']在Windows Manager(X.org)中为您提供windowID,但它在PyGame的“外部”。也许使用python库Xlib你可以做点什么。


修改

我在Setting the window dimensions of a running application中尝试了更改终端大小的示例,但它可以正常工作但不会改变PyGame窗口大小。我尝试使用xlib来获取PyGame窗口标题并且它可以工作,但是我无法设置PyGame窗口标题。看起来PyGame不尊重新标题。

我使用此代码测试PyGame窗口标题 - 它可以获取标题但不能设置标题。

import sys

import pygame
from pygame.locals import *

import Xlib
import Xlib.display

WIDTH, HEIGHT = 1500, 300

pygame.init()

screen = pygame.display.set_mode((800,600),0,32)

print "wm_info:", pygame.display.get_wm_info()
print "  window:", pygame.display.get_wm_info()['window']
print "fswindow:", pygame.display.get_wm_info()['fswindow']
print "wmwindow:", pygame.display.get_wm_info()['fswindow']

display = Xlib.display.Display()
root = display.screen().root

#windowID = root.get_full_property(display.intern_atom('_NET_ACTIVE_WINDOW'), Xlib.X.AnyPropertyType).value[0]
#print "Xlib windowID:", windowID
#window = display.create_resource_object('window', windowID)

window = display.create_resource_object('window', pygame.display.get_wm_info()['window'])
window.configure(width = WIDTH, height = HEIGHT)
print "Xlib   window get_wm_name():", window.get_wm_name()

window = display.create_resource_object('window', pygame.display.get_wm_info()['fswindow'])
window.configure(width = WIDTH, height = HEIGHT)
print "Xlib fswindow get_wm_name():", window.get_wm_name()

window = display.create_resource_object('window', pygame.display.get_wm_info()['wmwindow'])
window.configure(width = WIDTH, height = HEIGHT)
print "Xlib wmwindow get_wm_name():", window.get_wm_name()

print

print "Xlib wmwindow set_wm_name(hello world of xlib)"
window.set_wm_name("hello world of xlib")
display.sync()

print "Xlib wmwindow get_wm_name():", window.get_wm_name()


# --------------

fpsClock = pygame.time.Clock()
RUNNING = True
while RUNNING:

    for event in pygame.event.get():
        if event.type==QUIT:
            RUNNING = False

        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                RUNNING = False

    fpsClock.tick(25)

# --------------

pygame.quit()
sys.exit()

我使用此代码更改窗口大小 - 它适用于终端和DreamPie(python shell):

# https://unix.stackexchange.com/questions/5999/setting-the-window-dimensions-of-a-running-application

WIDTH, HEIGHT = 1500, 300
import Xlib
import Xlib.display

display = Xlib.display.Display()
root = display.screen().root
windowID = root.get_full_property(display.intern_atom('_NET_ACTIVE_WINDOW'), Xlib.X.AnyPropertyType).value[0]
window = display.create_resource_object('window', windowID)
window.configure(width = WIDTH, height = HEIGHT)
display.sync()

#windowIDs = root.get_full_property(display.intern_atom('_NET_CLIENT_LIST'), Xlib.X.AnyPropertyType).value
#for windowID in windowIDs:
#   window = display.create_resource_object('window', windowID)
#   name = window.get_wm_name() # Title
#   pid = window.get_full_property(display.intern_atom('_NET_WM_PID'), Xlib.X.AnyPropertyType) # PID