Hi,
ich möchte mir einen Teleprompter mit meinem Pi basteln.
Dazu habe ich folgenden Code im Internet gefunden, den ich schon leicht modifiziert habe:
Code
#!/usr/bin/env python
# coding: utf8
import os, pygame, sys
pygame.init() #Initialisierung
os.environ['SDL_VIDEO_WINDOW_POS'] = 'center'
pygame.display.set_caption("Teleprompter")
screenWidth = 1800
screenHeight = 960
screen = pygame.display.set_mode([screenWidth, \
screenHeight],0,32)
background = pygame.Surface((screenWidth,screenHeight))
segments = 5
segment = 0 #Ausgangspunkt
textHeight = screenHeight / segments
textSurface = [ pygame.Surface((screenWidth, \
textHeight)) for s in range(0,segments+1)]
#Farben der Benutzerschnittstelle definieren
cBackground =(0,0,0) #Schwarz
cText = (255,255,255) #Weiß
scrollSize = 0.1
background.fill(cBackground) #Hintergrundfarbe
font = pygame.font.Font(None, textHeight)
numberOfLines = 0
newsLines = list()
fName = "news.txt" #zu verwendender Dateiname
mirror = False
pause = False
anymore = False
def main():
global anymore
while True :
getNews()
lines = 0
while lines < numberOfLines :
for i in range(segments, 0, -1):
#Texte verschieben
textSurface[i] = textSurface[i-1]
lines = setWords(lines,0)
offset = 0
while offset < textHeight:
checkForEvent()
if not pause :
drawScreen(offset)
offset += scrollSize
anymore = False
while not anymore :
checkForeEvent()
def getNews(): #news-Datei öffnen
global numberOfLines, newsLines
numberOfLines = 0
newsLines = list()
nfile = open(fName,"r")
for line in nfile.readlines():
newsLines.append(line)
numberOfLines +=1
nfile.close()
def drawScreen(offset) : #Bildschirmausgabe
global segment
screen.blit(background,[0,0]) #Hintergrundfarbe
for index in range(0,segments+1):
segment +=1
if(segment > segments): #Von vorne anfangen
segment = 0
drawWords(segment,offset)
pygame.display.update()
def setWords(index,segment) :
endOfLine = False
margin = 30 #Abstand links und rechts
words = newsLines[index].split() #Wörter einlesen
wordsAvailable = len(words)
wordsToUse = 0
wordsWidth = 0
tryLine = ""
while wordsWidth < screenWidth - margin and \
wordsAvailable >= wordsToUse + 1:
tryLine = ""
wordsToUse += 1
for test in range(0, wordsToUse):
tryLine = tryLine + words[test] + " "
textSurface[segment] = font.render(tryLine,\
True, cText, cBackground )
tryWidth = textSurface[segment].get_rect()
wordsWidth = tryWidth.right
useLine = ""
if wordsWidth > screenWidth - margin: #Zeilenende
wordsToUse -= 1 #ein Wort weniger verwenden
else :
endOfLine = True
for test in range(0, wordsToUse): #Zeile aufbauen
useLine = useLine + words[test] + " "
textSurface[segment] = font.render(useLine, \
True, cText, cBackground )
newsLines[index] = newsLines[index] \
[len(useLine) :]
if endOfLine : #nächste Zeile
index += 1
return index
def drawWords(index,offset) :
textRect = textSurface[index].get_rect()
textRect.centerx = screenWidth / 2
textRect.top = screenHeight - (textHeight * \
index) - offset
if mirror :
screen.blit(pygame.transform.flip( \
textSurface[index], True, False), textRect)
else :
screen.blit(textSurface[index], textRect)
def terminate(): #Beenden
print ("Wird beendet, bitte warten!")
pygame.quit() #Pygame beenden
sys.exit()
def checkForEvent(): #Soll beendet werden?
global scrollSize, pause, anymore, fName, mirror
event = pygame.event.poll()
if event.type == pygame.QUIT :
terminate()
if event.type == pygame.KEYDOWN :
if event.key == pygame.K_ESCAPE :
terminate()
if event.key == pygame.K_DOWN :
scrollSize -= 1
if scrollSize == 0:
scrollSize = 1
if event.key == pygame.K_UP :
scrollSize += 1
if event.key == pygame.K_SPACE :
pause = not pause
if event.key == pygame.K_m :
mirror = not mirror
if event.key == pygame.K_0 :
anymore = True
fName = "news.txt"
if event.key == pygame.K_1 :
anymore = True
fName = "news1.txt"
if event.key == pygame.K_2 :
anymore = True
fName = "news2.txt"
if event.key == pygame.K_3 :
anymore = True
fName = "news3.txt"
if __name__ == '__main__':
main()
Alles anzeigen
Quelle: Projekte mit dem Raspberry Pi - mitp Verlags GmbH & Co. KG (Google Books)
Leider verlangt das Programm mehr von meiner CPU als sie hergeben kann.
Der Text hakt daher beim Wiedergeben.
Habt ihr Ideen, wie oder ob man den Code modifizieren kann, um die CPU weniger zu belasten?
Ich kann zwar nachvollziehen was der Code macht, habe allerdings noch nie mit Python gearbeitet und habe daher noch keine Idee dazu.