PyGame窗口停止显示

8

我一直在学习Python,并决定玩一下PyGame。当我运行脚本时,PyGame窗口会随机停止显示。我没有收到任何错误信息,PyGame窗口就是显示不出来。

脚本以前可以工作,现在不行了。我以前也遇到过这个问题,重启电脑几次后它最终又开始工作了。但现在它又发生了。

所以,我不知道是什么原因导致的,也不知道该如何解决。我已经尝试使用两个不同的PyGame脚本,都无法工作。我将在下面发布一个样例脚本。

我使用的是:

  • PyGame v2.0.1
  • SDL v2.0.14
  • Python 3.7.3
  • 操作系统:Windows 10
  • IDE:PyCharm

我知道PyGame版本2是新的,这是一个新版本的BUG吗?感谢您的帮助。

编辑: 再次重启计算机暂时修复了该问题。我仍然在寻找长期解决该问题的方法,以便在每次出现此类问题时不必重新启动计算机。

这是一些示例代码:

import pygame, sys
pygame.init()
windowSize = sizeW, sizeH = 1920, 1080
window = pygame.display.set_mode(windowSize)
pygame.display.set_caption('Test')
black = 0, 0, 0
speed = 0.2
x, y = 50, 50
h, w = 50, 50
blue = 0, 0, 255

guy = pygame.image.load('tile032.png')

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT] and x - speed > 0:
        x -= speed
    if keys[pygame.K_RIGHT] and x + w + speed < sizeW:
        x += speed
    if keys[pygame.K_UP] and y - speed > 0:
        y -= speed
    if keys[pygame.K_DOWN] and y + speed + h < sizeH:
        y += speed

    window.fill(black)
    window.blit(guy, (x,y))
    pygame.display.update()

这个链接讲解了Pygame编程的内容,非常详细易懂。希望对你有所帮助。 - INDRAJITH EKANAYAKE
1
pygame.init() 是不是需要很长时间才能运行?这是一个已知的问题,你应该能够找到现有的解决方案。你确认了那个点之后的代码是否真正在运行吗? - Random Davis
当您运行脚本时,是否出现黑屏? - PianoPianist
8个回答

1
我认为你应该使用pygame.quit()或者只是quit(),或者说run is False而不是使用sys.exit(),因为对我个人来说,在运行pygame时,它会破坏我的代码。所以尝试使用以下方法关闭你的pygame窗口:
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        # loop will run for last time then the game will stop
        run = False

希望这对你有所帮助!

目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community
致电 pygame.quit() 是很重要的,因为它允许所有分配的资源被正确关闭和释放。也许你没有进行清理,可能已经用尽了文件句柄、音频资源、字体句柄或类似的资源。这可能会阻止窗口再次打开。 - Kingsley

0

正确处理关闭窗口,使用pygame.quit()。

for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

很遗憾,这并没有解决问题。问题在于弹出窗口,而不是关闭窗口。 - Spencer Wise
尝试添加 clock.tick()。 - Ashish M J
我重新启动了电脑,问题得到了解决。我认为在将来添加clock.tick()并不能解决这个问题,因为已经在另一个面临相同问题的程序中使用了。 - Spencer Wise

0
通常我会在代码的最后,循环、类和方法之外使用pygame.quit()。由于我是一个非常新的pygame用户,所以我通常不使用sys.exit(),但你应该在事件循环中将run设置为false,这样它就会在最后调用pygame.quit()方法。像其他人建议的那样,在此之后也可以使用sys.exit()

Warren Sande有一个非常好的版本,我在所有我的pygame脚本中都使用它。running = True while running: for event in pygame.get_event(): if event == pygame.QUIT: running = False pygame.quit() - Jaxer5636

0
通常这个问题发生在你刚调用pygame窗口后就退出的情况下。这可以通过run变量转为False之后再退出pygame来解决。或者在程序结束时或将run函数定义为false后实现逻辑。

这里似乎不是这种情况。我已经运行了脚本并让它坐了几分钟,看看PyGame窗口是否最终会弹出。仍然没有任何反应。即使我像其他人建议的那样在此脚本中添加了pygame.quit(),我也不认为过早退出是问题所在。 - Spencer Wise

0

不要使用 sys.exit(),而是使用 pygame.quit()。我认为这样就可以了。


0

在 Pygame 窗口关闭后,查看终端是否有错误。如果您不使用 Linux,请查看通常出现错误的位置。


问题中已经提到,当窗口停止显示时,没有观察到任何错误信息。这本来可以作为一条评论。 - typedecker

0

也许在代码的不同点添加一些打印语句,这样您就可以看到它是否被卡住以及在哪里。这将有助于大大简化故障排除。

我知道这与主题无关,但是在使用pygame.image.load()时,您应该在末尾添加.convert()(或者如果图像包含透明点,则添加.convert_alpha())。

例如:guy = pygame.image.load("tile032.png").convert_alpha()

很抱歉我帮不上更多忙。


0

我认为你的代码有错误

window.blit(guy, (x, y))

在pygame中,据我所知,你必须使用pygame.Rect而不是切片。尝试使用以下代码:

window.blit(guy, guy.get_rect(topleft=(x, y)))

https://younglinux.info/pygame/image

另外,我认为你应该这样做。

import pygame, sys, time # code remade
pygame.init()
windowSize = sizeW, sizeH = 1920, 1080
window = pygame.display.set_mode(windowSize)
pygame.display.set_caption('Test')
black = 0, 0, 0
speed = 0.2
x, y = 50, 50
h, w = 50, 50
blue = 0, 0, 255

guy = pygame.image.load('tile032.png')

deltaTime = 0 #code remade

run = True
while run:
    start = time.time()#code remade
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT] and x - speed > 0:
        x -= speed * deltaTime #code remade
    if keys[pygame.K_RIGHT] and x + w + speed < sizeW:
        x += speed * deltaTime #code remade
    if keys[pygame.K_UP] and y - speed > 0:
        y -= speed * deltaTime #code remade
    if keys[pygame.K_DOWN] and y + speed + h < sizeH:
        y += speed * deltaTime #code remade

    window.fill(black)
    window.blit(guy, guy.get_rect(topleft=(x, y)))
    pygame.display.update()
    deltaTime = time.time() - start #code remade

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