Raspberry Pi 上的 GPIO 引脚状态发生变化后,如何更新 pygame 中的显示?
How do I update my display in pygame after a state change in a GPIO pin on a Raspberry Pi?
我的想法是,我有几个开关连接到 Raspberry Pi 3 B+ 上的 GPIO 引脚,一旦第一个开关打开,'text 2' 就会出现。只有第一个开关打开后,第二个开关才能被激活。第二个开关打开后,会出现'text 3'。只有当第二个开关打开时,第三个和最后一个开关才能被激活。激活第三个开关后,出现'text 4'。
文本按应有的方式显示,但文本一直在闪烁。我怀疑这是因为我在同一个循环中有多个 pygame.display.flip() ,但我找不到解决它的方法。我基本上可以更改背景颜色并移动新文本出现的位置以“隐藏”闪烁,但我觉得好像有更理智的解决方案。有没有人有任何想法可以让我开始?
这里是相关代码(这里不包括所有颜色和文本的常量):
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if GPIO.input(24) == 1:
window.fill(white)
color1 = white
color2 = black
color3 = white
color4 = white
window.blit(text2, (window_width/2 - 50,window_height/2 - 100))
pygame.display.flip()
if GPIO.input(18) == 0:
color3 = white
if GPIO.input(18) == 1:
window.fill(white)
color1 = white#Second puzzle GPIO
color2 = white
color3 = black
color4 = white
window.blit(text3, (window_width/2 - 50,window_height/2 - 100))
pygame.display.flip()
if GPIO.input(16) == 0:
color4 = white
if GPIO.input(16) == 1:
window.fill(white)
color1 = white
color2 = white
color3 = white
color4 = black
window.blit(text4, (window_width/2 - 50,window_height/2 - 100))
pygame.display.flip()
正如OP所说,闪烁确实是由多次调用pygame.display.flip()
每个循环引起的。
我认为最好在循环开始时获取您的 GPIO 引脚值,然后在单个屏幕绘制代码块中显示状态:
BLACK = ( 0, 0, 0 )
myfont = pygame.font.Font( None, 16 )
text1 = myfont.render( "Unused", True, BLACK )
text2 = myfont.render( "GPIO-24", True, BLACK )
text3 = myfont.render( "GPIO-18", True, BLACK )
text4 = myfont.render( "GPIO-16", True, BLACK )
# position texts every 100 pixels
text1_rect = text1.get_rect( top_left = ( 50, 100 ) )
text2_rect = text2.get_rect( top_left = ( 150, 100 ) )
text3_rect = text3.get_rect( top_left = ( 250, 100 ) )
text4_rect = text4.get_rect( top_left = ( 350, 100 ) )
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Read GPIO Pin values
gpio_pin16 = GPIO.input( 16 )
gpio_pin18 = GPIO.input( 18 )
gpio_pin24 = GPIO.input( 24 )
# Paint the screen
window.fill(white)
if ( gpio_pin24 == 1 ):
window.blit( text2, text2_rect )
if ( gpio_pin18 == 1 ):
window.blit( text3, text3_rect )
if ( gpio_pin16 == 1 ):
window.blit( text4, text4_rect )
pygame.display.flip()
pygame.quit()
我没有完整的代码可以使用,所以我只是猜测它应该如何工作。您现有的标签被绘制到完全相同的位置,这就是相互遮挡的原因。
所以在上面的代码中,我们定义了text2_rect
等来正式定位需要绘制文字的位置,保证布局良好。如果 GPIO 引脚为高电平,主循环绘制文本,否则将屏幕的该区域留空。目前尚不清楚颜色如何根据提供的代码工作,所以我忽略了这一点。
如果你想让它们在屏幕上自动定位,你可以使用 0
、window_width//4
、window_width//2
、3*window_width//4
等 x 坐标。
我的想法是,我有几个开关连接到 Raspberry Pi 3 B+ 上的 GPIO 引脚,一旦第一个开关打开,'text 2' 就会出现。只有第一个开关打开后,第二个开关才能被激活。第二个开关打开后,会出现'text 3'。只有当第二个开关打开时,第三个和最后一个开关才能被激活。激活第三个开关后,出现'text 4'。
文本按应有的方式显示,但文本一直在闪烁。我怀疑这是因为我在同一个循环中有多个 pygame.display.flip() ,但我找不到解决它的方法。我基本上可以更改背景颜色并移动新文本出现的位置以“隐藏”闪烁,但我觉得好像有更理智的解决方案。有没有人有任何想法可以让我开始?
这里是相关代码(这里不包括所有颜色和文本的常量):
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if GPIO.input(24) == 1:
window.fill(white)
color1 = white
color2 = black
color3 = white
color4 = white
window.blit(text2, (window_width/2 - 50,window_height/2 - 100))
pygame.display.flip()
if GPIO.input(18) == 0:
color3 = white
if GPIO.input(18) == 1:
window.fill(white)
color1 = white#Second puzzle GPIO
color2 = white
color3 = black
color4 = white
window.blit(text3, (window_width/2 - 50,window_height/2 - 100))
pygame.display.flip()
if GPIO.input(16) == 0:
color4 = white
if GPIO.input(16) == 1:
window.fill(white)
color1 = white
color2 = white
color3 = white
color4 = black
window.blit(text4, (window_width/2 - 50,window_height/2 - 100))
pygame.display.flip()
正如OP所说,闪烁确实是由多次调用pygame.display.flip()
每个循环引起的。
我认为最好在循环开始时获取您的 GPIO 引脚值,然后在单个屏幕绘制代码块中显示状态:
BLACK = ( 0, 0, 0 )
myfont = pygame.font.Font( None, 16 )
text1 = myfont.render( "Unused", True, BLACK )
text2 = myfont.render( "GPIO-24", True, BLACK )
text3 = myfont.render( "GPIO-18", True, BLACK )
text4 = myfont.render( "GPIO-16", True, BLACK )
# position texts every 100 pixels
text1_rect = text1.get_rect( top_left = ( 50, 100 ) )
text2_rect = text2.get_rect( top_left = ( 150, 100 ) )
text3_rect = text3.get_rect( top_left = ( 250, 100 ) )
text4_rect = text4.get_rect( top_left = ( 350, 100 ) )
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Read GPIO Pin values
gpio_pin16 = GPIO.input( 16 )
gpio_pin18 = GPIO.input( 18 )
gpio_pin24 = GPIO.input( 24 )
# Paint the screen
window.fill(white)
if ( gpio_pin24 == 1 ):
window.blit( text2, text2_rect )
if ( gpio_pin18 == 1 ):
window.blit( text3, text3_rect )
if ( gpio_pin16 == 1 ):
window.blit( text4, text4_rect )
pygame.display.flip()
pygame.quit()
我没有完整的代码可以使用,所以我只是猜测它应该如何工作。您现有的标签被绘制到完全相同的位置,这就是相互遮挡的原因。
所以在上面的代码中,我们定义了text2_rect
等来正式定位需要绘制文字的位置,保证布局良好。如果 GPIO 引脚为高电平,主循环绘制文本,否则将屏幕的该区域留空。目前尚不清楚颜色如何根据提供的代码工作,所以我忽略了这一点。
如果你想让它们在屏幕上自动定位,你可以使用 0
、window_width//4
、window_width//2
、3*window_width//4
等 x 坐标。