我有一个使用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
答案 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