我正在学习使用Pygame,当我使用sys.exit()
时,我遇到了一个问题。这是代码:
import pygame, sys,os
from pygame.locals import *
pygame.init()
window = pygame.display.set_mode((468, 60))
pygame.display.set_caption('Game')
screen = pygame.display.get_surface()
file_name = os.path.join("data","image.bmp")
surface = pygame.image.load(file_name)
screen.blit(surface, (0,0))
pygame.display.flip()
def input(events):
for event in events:
if event.type == QUIT:
sys.exit(0)
else:
print event
while True:
input(pygame.event.get())
这只是pygame教程中的代码。无论我尝试使用什么事件sys.exit()
,我实际尝试退出时都会出现问题。
Traceback (most recent call last):
File "C:/Python27/Lib/site-packages/pygame/examples/test.py", line 25, in <module>
input(pygame.event.get())
File "C:/Python27/Lib/site-packages/pygame/examples/test.py", line 20, in input
sys.exit(0)
SystemExit: 0
...然后程序不会退出。我在这做错了什么?因为我注意到这段代码是针对一个过时的Python版本。
答案 0 :(得分:8)
sys.exit()
单独对pygame有点邪恶..退出pygame应用程序的正确方法是首先打破mainloop然后退出pygame然后退出程序。即
while running == True:
# catch events
if event_type == quit:
running = False # breaks out of the loop
pygame.quit() # quits pygame
sys.exit()
在我看来,你没有正确地抓住这个事件..它应该是
if event.type == pygame.QUIT:
您可以在pygame here中阅读有关事件的更多信息。
答案 1 :(得分:3)
sys.exit
只会引发异常(SystemExit异常)。这有两个不寻常的影响:
答案 2 :(得分:3)
我解决了这个问题,正确的代码如下:
running = True
while running == True:
for event in pygame.event.get():
if event.type == QUIT:
running = False # Exiting the while loop
screen.blit(background, (0,0))
pygame.display.update()
pygame.quit() # Call the quit() method outside the while loop to end the application.
答案 3 :(得分:1)
我在某些消息来源中读到,运行Python shell的Tkinter中的mainloop()与sys.exit()命令后面的Pygame.init()之间存在冲突。
建议是从命令行运行游戏以解决问题,而不是使用shell中的run(F5)加载游戏。
这是一个很好的副作用,在我的太空入侵者游戏中,它进行了大量的变量更新:每秒35次,是动画正确运行而从外壳运行得很糟糕而且生涩。
如果我使用以下代码:
if event.type == QUIT:
pygame.quit()
sys.exit()
游戏正确退出但在shell中留下了一条错误消息,对游戏没有任何影响,并且在很大程度上是多余的。这有点难看。这不会从命令行发生。
总结:尝试从命令行运行游戏以避免Tkinter问题
答案 4 :(得分:1)
如果仍然有问题,请(在中断循环之后)尝试使用sys.exit(0)
而不是sys.exit()
。希望能对您有所帮助。它为我工作。 pygame似乎希望显式传递“ status”参数(即此处为0)。
请参见以下示例:
isRunning = True
while isRunning:
# Catch events
if event.type == pygame.QUIT:
isRunning = False # Breaks the loop
pygame.quit()
sys.exit(0)