新文本在pygame中的旧文本上呈现

时间:2013-12-18 10:37:54

标签: python pygame raspberry-pi

我在pygame中编写了一个应用程序来显示一些文本。该文本由一个每秒钟左右更新一次的计数器组成。我在这个应用程序中使用raspberry pi。因此,当我使用xserver时,所有内容都会正确显示,但如果我使用sdl_videodriver fbcon进行显示,则静态文本会正确显示,但其值更改的计数器(文本)无法正确显示。计数器的新值显示在较旧的值上,因此在几秒钟后它变得不可读。以下是我的代码

class pyscope :

 def __init__(self):
    disp_no = os.getenv("DISPLAY")
    if disp_no:
        print "I'm running under X display = {0}".format(disp_no)
    drivers = ['fbcon', 'directfb', 'svgalib']
    found = False
    for driver in drivers:
        if not os.getenv('SDL_VIDEODRIVER'):
            os.putenv('SDL_VIDEODRIVER', driver)
        try:
            pygame.display.init()
        except pygame.error:
            print 'Driver: {0} failed.'.format(driver)
            continue
        found = True
        break
    if not found:
        raise Exception('No suitable video driver found!')
    size = [1920,1080]
    self.screen = pygame.display.set_mode(size,pygame.FULLSCREEN)

    self.screen.fill((0,0,0))
    pygame.font.init()
    pygame.display.update()

def __del__(self):
    "Destructor to make sure pygame shuts down, etc."

def test(self):
    pygame.display.set_caption("Test")
    done=False
    clock=pygame.time.Clock()
    font = pygame.font.SysFont("consolas", 34, True)
    frame_rate = 20
    count = 0
    while done==False:
        for event in  pygame.event.get():
            if event.type == pygame.QUIT:
                done=True
        high_score = 2270
        plan = 2100
        count = count + 1
        font = pygame.font.SysFont("consolas", 200, True)
        if count >100:
            count = 12
        output_string = "ACTUAL          %s" %count
        text = font.render(output_string,True,red)
        pygame.display.flip()
        self.screen.blit(text, [250,420])
        output1 = "random          %.2f" %(float(count)/100*100)
        text = font.render(output1,True,red)
        self.screen.blit(text, [250,540])
        pygame.display.flip()
        clock.tick(20)
        pygame.display.flip()
scope = pyscope()
scope.test()
time.sleep(10)

因此我的问题是如何在使用sdl_videodriver时避免在旧文本上呈现新文本?

3 个答案:

答案 0 :(得分:1)

听起来pygame没有清除文本计数器的区域。 由于我无法访问树莓派,我建议你这样做 确保清除/更新计数器的渲染区域。

答案 1 :(得分:1)

update()屏幕是不够的,你还应该用颜色“清除”它。在进行任何blitting /绘图之前,请执行以下操作:

self.screen.fill((0,0,0))

在初始化应用程序时,您目前只执行一次。如果你想在每一帧上保持一个全新的屏幕,这应该在每一帧上完成。

答案 2 :(得分:1)

在显示文本之前,您可以使用pygame.draw.rect

清除屏幕区域

pygame.draw.rect(self.screen,(0,0,0),text.get_rect())

只要您的背景是纯色,就可以正常工作。