新的文本呈现在在pygame的较早的文本(new text rendered over older

2019-10-19 03:42发布

我在pygame中写了一个应用程序来显示一些文本。 文本由它每秒更新一次左右计数器。 我使用的树莓派这种应用。 所以,当我使用的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?

Answer 1:

这是不够的update()的屏幕,你也应该“透明”与一种颜色。 任何的blitting /绘图之前,这样做:

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

您目前只能做一次 ,初始化应用程序时。 这应该每一帧上进行,如果你想保持新鲜,新屏幕的每个框架上。



Answer 2:

这听起来像pygame的不清除文本计数器的区域。 因为我没有获得一个树莓派我建议你请务必清除/更新其中计数器呈现的区域。



Answer 3:

阻击器出来的文字之前,你可以清除与屏幕区域pygame.draw.rect

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

应该工作正常,只要你的背景是纯色。



文章来源: new text rendered over older text in pygame