我有一个使用pygame在python中构建的应用程序,它最初以不可恢复的设置大小显示登录屏幕,然后当用户登录到游戏时,保存的设置将用于转换窗口大小。登录后,该窗口将变为RESIZABLE。如果用户注销,则窗口将更改回没有RESIZABLE标志的初始大小。只要用户从正常窗口注销,一切都可以,但当用户点击最大化按钮,然后在某些发行版中注销时,窗口仍然保持最大化,登录屏幕绘制在窗口的左上角。
问题来了,有没有一种方法可以检测窗口是否已被最大化,这样我就可以在缩小大小之前取消最大化?
我在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
get_wm_info()['wmwindow']
在Windows管理器(X.org)中为您提供windowID,但它在PyGame之外。也许使用python库Xlib
,您可以做一些事情。
编辑:
我在设置一个正在运行的应用程序的窗口尺寸以改变终端大小中尝试了一个例子,它很有效,但它不会改变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