我在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时避免在旧文本上呈现新文本?
答案 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())
只要您的背景是纯色,就可以正常工作。