pygame中的全屏模式完全是黑屏

3

我在使用pygame的全屏选项时遇到了一些问题。以下是一些简单绘制蓝色窗口的代码,通过按下 R 可以在蓝色和紫色之间切换。然后我们也可以使用 F 或者 G 切换全屏或窗口模式。其中 F 是显式实现的,而 G 使用了方法toggle_fullscreen()

import pygame, sys
from pygame.locals import *

#Initializes pygame
pygame.init()

#Defines the Clock object
clock = pygame.time.Clock()

#Just draws a blue screen
size = (960, 540)
blue = (0,0,100)
purp = (100,0,100)
is_blue = True
display_surf = pygame.display.set_mode(size, RESIZABLE)
display_surf.fill(blue)

mainLoop = True
is_fullscreen = False

#Mainloop
while mainLoop:

    dt = clock.tick(12)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            mainLoop = False
        if event.type == pygame.KEYDOWN:
            #Single key pressed
            if event.key == K_f:
                #Toggles fullscreen
                is_fullscreen = not is_fullscreen
                old_surface = display_surf
                setmode = FULLSCREEN if is_fullscreen else RESIZABLE
                display_surf = pygame.display.set_mode(size, setmode)
                display_surf.blit(old_surface, (0,0))
                del old_surface
            if event.key == K_q:
                #Quits the app
                mainLoop = False
            if event.key == K_r:
                #Redraws the blue or purple
                print("Trying to flip colors")
                display_surf.fill(purp if is_blue else blue)
                is_blue = not is_blue
            if event.key == K_g:
                #Toggles fullscreen with the dedicated method
                is_fullscreen = not is_fullscreen
                pygame.display.toggle_fullscreen()

    pygame.display.update()

pygame.quit()


我使用的是Ubuntu 18.04,Python版本是3.6.8。以下是我的观察结果:
  1. 使用pygame 2.0.0.dev6,在按下FG键进入全屏模式时,屏幕会出现以下情况:
    1. 闪烁几次
    2. 变为任务栏中的最小化图标
    3. 如果我点击图标,则屏幕再次闪烁几次,最终进入全屏模式
    4. 问题:屏幕完全黑屏,R按钮不会翻转颜色(但会打印消息)
  2. 仍在使用pygame 2.0.0.dev6。在从全屏模式切换回窗口模式时,GF按钮表现不同:在使用G键返回窗口模式后,R按钮即使在窗口模式下也不会翻转颜色。而当我使用F键时,它可以正常工作。
  3. 使用pygame 2.0.0.dev3时,G按钮完全不起作用,而F的行为与之前相同。

我的主要问题是1.4:全屏模式完全黑屏。

现在,让我们进行修改。更改代码中F按钮的以下行:

setmode = FULLSCREEN|SCALED if is_fullscreen else RESIZABLE    #FULLSCREEN -> FULLSCREEN|SCALED

这会全屏显示当前屏幕分辨率,而不是我在顶部指定的分辨率。现在问题1.1.、1.2.和1.3.都解决了:应用程序立刻全屏显示。但问题1.4.仍然存在,此外该程序不再接受输入。如果我按Q键,它不会退出。它不接受Alt+TabAlt+F4,因此我必须重新启动计算机。

1
所有2.x版本都非常新 - 请尝试使用1.9.6。在基于Ubuntu的Linux Mint上,使用PyGame 1.9.6和Python 3.7.5 - G会绘制蓝屏。对于F,我必须复制表面以查看蓝屏 - old_surface = display_surf.copy()。如果不复制,您只会创建到display_surf的别名/引用,当您创建新窗口时,它可能会被清除。R适用于所有方法。 - furas
我切换到pygame的第二个版本,因为它在CPU使用方面存在一些问题(参见https://dev59.com/VlYO5IYBdhLWcg3wN_Cf#58678475)。我的风扇像疯了一样旋转。不过我可以尝试一下,谢谢。 - MannyC
1
顺便提一下:在Linux中,当前带有GUI的会话在终端tty7中运行,您可以使用Ctrl+Alt+F1切换到文本模式的终端tty1,重新登录系统并使用ps aux | grep python查看所有Python程序及其ID的列表,以获取pygame程序的ID,并使用kill ID停止/杀死该程序。然后,您可以使用Ctrl+Alt+F7返回带有GUI的终端。 - furas
你可以使用 tty2tty6 或者按下 Ctrl+Alt+F2Ctrl+Alt+F6 来代替 tty1 - furas
按下 Ctrl+Alt+Backspace 可以注销您的系统并关闭所有正在运行的程序 - 您只需要重新登录即可。这比重新启动整个系统更快。 - furas
也许你应该将它发送给 Pygame 的作者,可以在 issues tracker 上提交。 - furas
1个回答

3

pygame.display.set_mode创建一个pygame.Surface对象,该对象与窗口关联。当再次调用pygame.display.set_mode()时,之前关联到表面的对象将变为无效。

你需要copy()“旧”的表面:

is_fullscreen = not is_fullscreen

old_surface = display_surf.copy()

setmode = FULLSCREEN if is_fullscreen else RESIZABLE
display_surf = pygame.display.set_mode(size, setmode)
display_surf.blit(old_surface, (0,0))

看起来它会出现相同的问题。不过还是谢谢,这绝对是我应该做的事情。 - MannyC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接