簡體   English   中英

Pygame 錯誤:顯示表面退出:為什么?

[英]Pygame error: display surface quit: Why?

誰能告訴我為什么我的應用程序退出:

pygame 錯誤:顯示 Surface 退出。

我有類似的問題,發現 Surface 對象不喜歡被深度復制。 當我在這樣的對象上使用 copy.deepcopy() 然后訪問副本時,我收到了那個奇怪的錯誤消息(沒有調用 pygame.quit())。 也許你遇到過類似的行為?

我在一段非常簡單的代碼中遇到了類似的問題:

    import sys, pygame
    pygame.init()

    size = width, height = 640, 480
    speed = [2, 2]
    black = 0, 0, 0

    screen = pygame.display.set_mode(size)
    ball = pygame.image.load("Golfball.png")
    ballrect = ball.get_rect()
    while 1:
        event = pygame.event.poll()
        if event.type == pygame.QUIT:
                pygame.quit()

        ballrect = ballrect.move(speed)
        if ballrect.left < 0 or ballrect.right > width:
            speed[0] = -speed[0]
        if ballrect.top < 0 or ballrect.bottom > height:
            speed[1] = -speed[1]
        screen.fill(black)
        screen.blit(ball, ballrect)
        pygame.display.flip()
        pygame.time.delay(5)

錯誤消息是:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "bounce.py", line 22, in <module>
        screen.fill(black)
    pygame.error: display Surface quit

所以我把

    import pdb

在頂部之后

    pygame.init()

並使用

    pdb.set_trace()

在行之后

    pygame.quit()

現在我運行程序,點擊關閉窗口,看到我掉進調試器實際上有點驚訝(畢竟,我預計退出會立即將我完全帶出)。 所以我得出結論,退出實際上並沒有在那時停止一切。 看起來程序在退出之后還在繼續,正在到達

    screen.fill(black)

這導致了問題。 所以我加了

    break

之后

    pygame.quit()

現在一切都很愉快。

[后來補充:我現在想到的是

    pygame.quit()

正在退出模塊,而不是正在運行程序,因此您需要休息一下才能退出這個簡單的程序。 ]

只是為了記錄,這意味着好的版本是

    import sys, pygame
    pygame.init()

    size = width, height = 640, 480
    speed = [2, 2]
    black = 0, 0, 0

    screen = pygame.display.set_mode(size)
    ball = pygame.image.load("Golfball.png")
    ballrect = ball.get_rect()
    while 1:
        event = pygame.event.poll()
        if event.type == pygame.QUIT:
                pygame.quit()
                break

        ballrect = ballrect.move(speed)
        if ballrect.left < 0 or ballrect.right > width:
            speed[0] = -speed[0]
        if ballrect.top < 0 or ballrect.bottom > height:
            speed[1] = -speed[1]
        screen.fill(black)
        screen.blit(ball, ballrect)
        pygame.display.flip()
        pygame.time.delay(5)

替換if event.type == pygame.quit(): by if event.type == pygame.QUIT:

import pygame, sys

running = True
while running:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
        pygame.quit() # quit the screen
        running = False
        sys.exit()

在 pygame.quit() 之后調用 sys.exit() 來停止程序,這樣你就不能在退出 pygame 后改變表面並且不會得到錯誤

確保你寫的是pygame.QUIT:而不是pygame.quit():我知道這聽起來很奇怪,但我遇到了同樣的問題。

我也有這個問題,但它是從另一個來源得到的。

我有一個這樣定義的類:

class PauseMenu(pygame.Surface)

我在忘記初始化 pygame.Surface 並嘗試對其進行 blit 時出現錯誤,使 pygame.screen 崩潰並給了我這個錯誤。

所以我只是明顯地添加了這個

pygame.Surface.__init__(self, (width, height))

來自http://archives.seul.org/pygame/users/Nov-2006/msg00236.html

2006 年 11 月 30 日星期四,21:27 -0300,Nicolas Bischof 寫道:

pygame.error: display Surface quit 這意味着什么?,我無法修復

這意味着調用了 pygame.display.quit() 或 pygame.quit()。 如果您在退出后嘗試對顯示表面執行任何操作,您將收到此錯誤。

我現在遇到了類似的問題,我已經找到了解決方案。

因為看起來pygame.quit()只會退出 pygame 模塊而不是整個程序,所以在下一行使用sys.exit()方法。

在這之后:

pygame.quit()

放置這個:

sys.exit()

完整片段:

pygame.quit()
sys.exit()

我也有這個問題,類似於 Maciej Miąsik 的回答,我的答案與 copy.deepcopy() 圖像有關。

我有:

import copy,pygame,sys
from pygame.locals import *

EMPTY_IMG= pygame.image.load('C:super/fancy/file/path/transparent.png')
held_image=copy.deepcopy(EMPTY_IMG)
my_rect=held_image.get_rect()
my_rect.center = (50,50)
screen.blit(held_image,my_rect)

我得到了同樣的錯誤。

我只是將 copy.deepcopy(EMPTY_IMG) 更改為 EMPTY_IMG。

import copy,pygame,sys
from pygame.locals import *

EMPTY_IMG= pygame.image.load('C:super/fancy/file/path/transparent.png')
held_image=EMPTY_IMG
my_rect=held_image.get_rect()
my_rect.center = (50,50)
screen.blit(held_image,my_rect)

然后一切正常。

只需在無限循環中更新顯示。

輸入這個:

pygame.display.update()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM