Python Pygame不会退出

时间:2016-05-30 15:01:57

标签: python pygame exit

代码逐个为像素着色,实际上是打印图片。如果按下X关闭或按Esc,我无法退出。我将所有pg.event.get()代码放在main while循环之外,在while循环内,在secondary for循环内,在third for循环内。我使用IDLE和Spyder运行它并且同样的问题,无论我把它放在哪里,我都无法让它退出。我怎样才能让它发挥作用????

loop = True
while loop:
    #Event Management for exiting the screen 
    for event in pg.event.get():
            keys = pg.key.get_pressed()
            if event.type == pg.QUIT:
                    loop = False
            elif keys[pg.K_ESCAPE]:
                    loop = False
    pg.event.pump()

    #Setup pixel transformation loop
    for i in range(0,463):
            for u in range (0,600):
                    screen.set_at((u,i),reddat[u,i]-greendat[u,i]-bluedat[u,i])
                    pg.display.flip()

    loop = False

4 个答案:

答案 0 :(得分:1)

您正在进行整个像素转换而不检查事件。这是你的伪代码流程:

loop until break:

    check events
    loop through pixels
        transform pixels
    break

相反,你应该放弃while loop,使check_for_quit成为一个函数,然后将该函数嵌套在转换循环中。

def check_for_quit():
    """Event Management for exiting the screen"""

    for event in pg.event.get():
        keys = pg.key.get_pressed()
        if event.type == pg.QUIT:
            return True
        elif keys[pg.K_ESCAPE]:
            return True
    pg.event.pump()
    return False


def draw():
    """Setup pixel transformation loop"""

    for i in range(0,463):
        for u in range (0,600):
            if check_for_quit():
                return

            screen.set_at((u,i),reddat[u,i]-greendat[u,i]-bluedat[u,i])
            pg.display.flip()

您可以check_for_quit返回TrueFalse来指示是否退出,而不是使用while循环,然后您可以在每个循环中测试{{1}当它结束时提前退出循环。

注意我不使用pygame,所以虽然这应该工作,但它可能不是在尝试检查事件时运行代码的最佳解决方案。

答案 1 :(得分:0)

在像素转换循环期间,您没有运行任何东西来检测事件。你是关于移动环路的正确轨道。

如果将事件检查代码转移到像素转换循环中,则可以在生成像素时轮询事件

示例:

for i in range(0,463):
    for u in range (0,600):
        screen.set_at((u,i),reddat[u,i]-greendat[u,i]-bluedat[u,i])
        for event in pg.event.get():
            if event.type == pg.QUIT:
                break
            elif event.type == py.KEYDOWN:
                if event.key == py.K_SPACE:
                    break
        pg.display.flip()

这也消除了对while循环的需要。

答案 2 :(得分:0)

首先,你的事件循环看起来很奇怪。我认为你应该使用*/10 * * * * /home/users/me/backupS3.sh >> /home/users/me/backupS3.log for event in pg.event.get():而不是两者。

我不确定您是想创建背景曲面还是构建效果。此外,您应该解释变量keys = pg.key.get_pressed()等是什么。

如果你只想要一个背景图像,你只需要在主循环之前创建一个表面,将像素blit到表面上然后在主循环中的屏幕上进行blit。

如果您想要进行构建,可以使用生成器来获取像素,然后使用reddat来获取它的块。这是一个积累的例子:

itertools.islice

编辑:有一种更简单的方法来创建构建效果:您可以将import sys import pygame as pg from itertools import islice def generate_pixels(width, height): """Generate pixel coords for the build-up effect.""" for i in range(height): for u in range(width): yield i, u def main(): clock = pg.time.Clock() width, height = (640, 480) screen = pg.display.set_mode((width, height)) pixels = generate_pixels(width, height) done = False while not done: for event in pg.event.get(): if event.type == pg.QUIT: done = True if event.type == pg.KEYDOWN: if event.key == pg.K_ESCAPE: done = True # Change the second arg of islice to adjust the speed. for i, u in islice(pixels, 2000): screen.set_at((u, i), (i % 256, u % 256, (i + u) % 256)) pg.display.flip() clock.tick(30) if __name__ == '__main__': pg.init() main() pg.quit() sys.exit() 参数传递给曲面的blit方法。因此,我们可以预先创建最终图像(或加载一个),然后只增加我们想要在显示表面上blit的图像的百分比。

area

答案 3 :(得分:0)

谢谢大家的帮助,我确实将事件循环移动到for循环中,通过分离键事件重新组织它们,如下所示。这对我有用。关于图像,这样做的目的是逐个像素地显示图像,这就是为什么我对每个循环进行blit。无论如何,感谢您的评论。下次我认为退出函数非常有用,所以会设置其中一个。 这对我有用吗

for u in range (0,600):
            for i in range(0,463):

                    screen.set_at((i,u),(reddat[u,i],greendat[u,i],bluedat[u,i]))
                    pg.display.flip()
            #Event Management for exiting the screen 
            for event in pg.event.get():
                    if event.type == pg.QUIT:
                            pg.quit()
                    keys = pg.key.get_pressed()
                    if keys[pg.K_ESCAPE]:
                            pg.quit()
            pg.event.pump()