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 引脚为高电平,主循环绘制文本,否则将屏幕的该区域留空。目前尚不清楚颜色如何根据提供的代码工作,所以我忽略了这一点。

如果你想让它们在屏幕上自动定位,你可以使用 0window_width//4window_width//23*window_width//4 等 x 坐标。