代码逐个为像素着色,实际上是打印图片。如果按下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
答案 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
返回True
或False
来指示是否退出,而不是使用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()