【问题标题】:The fullscreen mode in pygame is entirely blackpygame中的全屏模式是全黑的
【发布时间】:2019-12-01 15:31:30
【问题描述】:

我对 pygame 的全屏选项有一些问题。这是一些简单地绘制蓝色窗口的代码,通过按 R 我们可以在蓝色和紫色之间切换。然后我们还可以使用 FG 在全屏和窗口模式之间切换。 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 kbd> 按钮不会翻转颜色,即使在窗口版本中也是如此。当使用 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 所以我必须重新启动计算机。

【问题讨论】:

  • 所有版本 2.x 都是非常新的 - 尝试使用 1.9.6。在具有 PyGame 1.9.6 和 Python 3.7.5 的 Linux Mint(基于 Ubuntu)上 - G 绘制蓝屏。对于F,我必须复制表面才能看到蓝屏-old_surface = display_surf.copy()。如果没有复制,您只能创建对display_surf 的别名/引用,当您创建新窗口时可以将其清除。 R 适用于所有方法。
  • 我切换到 pygame 的第 2 版,因为它与 CPU usage 存在一些问题。我的风扇疯狂地旋转。不过我可以试试,谢谢。
  • 顺便说一句:在 Linux 中,带有 GUI 的当前会话在终端 tty7 中工作,您可以使用 Ctrl+Alt+F1 以文本模式更改为终端 tty1,再次登录系统并使用 ps aux | grep python 到查看所有 Python 程序及其 ID 的列表以获取 pygame 程序的 ID,并查看 kill ID 以停止/终止该程序。您可以使用Ctrl+Alt+F7 返回带有 GUI 的终端
  • 你也可以用tty1代替tty2 Ctrl+Alt+F2 .... tty6 Ctrl+Alt+F6
  • Ctrl+Alt+Backspace 应该将您从系统中注销并杀死所有正在运行的程序 - 您只需再次登录即可。比重新启动所有系统更快。

标签: python pygame fullscreen


【解决方案1】:

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))

【讨论】:

  • 它似乎给出了同样的问题。不过谢谢,这绝对是我应该做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多