关闭Pygame窗口

27

我刚花了相当长的时间找到一个64位的pygame安装包,用于python 3.3 (这里),现在我正在尝试创建一个窗口。然而,虽然窗口正常打开,但是当我点击x按钮时它不会关闭。实际上,我必须关闭IDLE才能关闭窗口。我正在运行64位版本的Win 7。这是我的代码:

import pygame
import time
(width, height) = (300, 200)
screen = pygame.display.set_mode((width, height))
pygame.display.flip()
pygame.display.set_caption("Hello World")
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

当我添加时

time.sleep(5)
pygame.quit()

它仍然没有关闭。我唯一的猜测是pygame.quit可能会在其中一个循环中,但即使解决了这个问题,我也非常希望能够在我想要关闭窗口时关闭它。


5
尝试从命令提示符中运行代码,看看问题是否仍然存在。 - xor
你看过pygame常见问题解答中相关的问题了吗? - rlms
你使用的是哪个Pygame版本? - Alfgaar
@Alfgaar 老实说,我不记得了。那是一段时间以前 :) - KnightOfNi
9个回答

37

大多数pygame教程似乎建议通过调用pygame.quit()然后sys.exit()退出。我个人遇到过问题(尽管是在Unix系统上),即仍然无法正确关闭窗口。解决方法是在pygame.quit()之前特别添加pygame.display.quit()。据我所知,这不应该是必要的,我不知道为什么这样做可以解决问题,但它确实可以。


2
pygame.init()初始化了所有的pygame模块(display, mixer, font等),而pygame.quit()则相反,关闭所有模块。如果你只想使用display,可以每次初始化一个模块,即使用pygame.display.init(),不需要调用pygame.init...但是根据你说的,pygame.quit在关闭display模块时出现了故障... - Alfgaar
感谢上帝,终于有一个可行的答案了!我一直在寻找一个不仅仅是重申pygame文档方法的答案。个人经验是,这个方法消除了窗口的冻结,但进程仍然停留在pygame.quit()。我只使用@Alfgaar的方法初始化显示器,然后完全删除pygame.quit()以最终关闭它。 - Alecg_O
我在尝试使用Spyder 4.1.3 IDE中的pygame 1.9.6时遇到了问题,但我的教程只有if event.type == pygame.QUIT: sys.exit()。一旦我在sys.exit()之前添加了pygame.quit(),它就可以正常工作了。 - Joe
@Joe 这很奇怪——我和你一样遇到了完全相同的问题(使用相同的Spyder版本和pygame版本),但是添加 pygame.quit() 对我来说并没有完全解决问题... - singularity
1
@singularity,这是对我有效的代码: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() 这是四行代码,我无法在注释中解决。 - Joe
这也适用于使用 keydown 事件(event.key == pygame.K_)退出 pygame 屏幕的情况。在我的 Mac 上使用 IDLE,仅使用 sys.exit() 会导致旋转的海滩球。但是,在 sys.exit() 之前特别添加 pygame.display.quit() 可以解决这个问题。谢谢,Erikun! - ghulseman

22

关闭窗口的一种方法是调用sys.exit():

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

我在pygame.quit()之后放置了sys.exit(),因为pygame.quit()会退出pygame软件,而sys.exit()则关闭窗口。

8

不确定,但可以尝试这个。因为我在我的系统上加上pygame.quit()之后,你的代码运行良好。

import pygame
import time
(width, height) = (300, 200)
screen = pygame.display.set_mode((width, height))
pygame.display.flip()
pygame.display.set_caption("Hello World")
running = True
try:
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
    pygame.quit()
except SystemExit:
    pygame.quit()

可能是因为Idle是基于Tkinter创建的,因此Tkinter和Pygame主循环之间没有相互理解。
不过,您的代码在命令提示符中运行非常好。


except SystemExit 能够正常工作,但它仍然会关闭 IDLE。此外,当我打开命令提示符时,它会返回错误“pygame.error:video system not initialized.” 有什么解决方法吗?顺便说一句,感谢您的帮助。 - KnightOfNi
我无法弄清为什么它会关闭IDLE(这不是我的情况)。 还要注意可能的问题是您正在使用pygame.quit() 替换代码中的 pygame.QUITpygame.quit() 是一个关闭pygame(但python仍在运行)的函数。而 pygame.QUIT 只是检查pygame是否正在运行。 - xor
我将 pygame.quit() 函数放在 while 循环后面,以确保在 while 循环结束后 pygame 不再运行。 不要在检查(if-else 语句)时使用它。 - xor

4
以下是在 OSX 上运行并保持 Jupyter 内核运行的最终代码。编辑 - 有时它仍会导致内核崩溃 :-(
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
pygame.display.quit()
pygame.quit()
exit()

还需要降级ipython以消除某些魔术别名警告消息,使用以下命令:
conda install ipython=7.2.0

显然,这个问题将在 ipython 7.6.0 中得到解决。


1
在顶部添加以下内容:
import sys

Add this where you need to quit:

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

1
在使用IDE(Spyder 3.3.6)运行Python 3.7.4时,我遇到了同样的问题。在我的情况下,pygame.quit()不能完全关闭程序。然而,添加quit()或exit()对我很有帮助!

0

尝试使用以下命令:

sys.exit(0)

注意:您需要导入sys库才能使用它。


0

IDE干扰了pygame运行代码的方式。尝试从命令行或终端运行它。问题应该会消失。


-2
回答原问题:您必须在退出主循环后调用pygame.quit()。 一个优雅的解决方案如下:
def run():
    pygame.init()
    while True:
        # ...
        for event in pygame.event.get():
            # Handle other events
            if event.type == pygame.QUIT:
                return pygame.quit()

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