Seite 1 von 1
Variables Fenster
Verfasst: Mittwoch 26. Mai 2010, 14:09
von majinv
Sers
ich wieder
ich hab folgendes kleines widget
Code: Alles auswählen
def soundLevel():
#Create window
window = pygame.display.set_mode((1366, 180))
pygame.display.set_caption('Sound level')
screen = pygame.display.get_surface()
i = 0
#2147483647.
maxm = 2247483647.
start_pos = 0.
end_pos = 0.
while True:
# Read data from device
l,data = inp.read()
if l:
#Start / endposition (y1,y2)
start_pos = end_pos
p = (audioop.max(data, 4))
end_pos = (int((p/maxm) * 100))
i = i + 1
#Draw lines (from max)
pygame.draw.line(screen, (0, 127, 255), (i-1, start_pos), (i, (int((p/maxm) * 100))), 1)
#Update screen
pygame.display.flip()
time.sleep(.001)
Wie man im anderen Thread wohl schon gesehen hat, fange ich gerade erst an, daher bin ich auch an Codeoptimierungen interessiert.
Aber nun zu meiner Frage, wenn der Bildschirmrand erreicht ist, zeichnet er ja logischerweise weiter, weil mein i sich erhöht.ich möchte aber eigentlich, dass sich das bild einfach nach links verschiebt... so das ich permanent die anzeige der derzeiten lautstärke habe...
kann mir da jmd weiterhelfen?
Re: Variables Fenster
Verfasst: Mittwoch 26. Mai 2010, 14:49
von BlackJack
@majinv: Du musst das Bild halt einfach nach links verschieben. Das kann man auf verschiedene Arten machen. Ich würde wahrscheinlich ein Surface verwenden, das doppelt so breit ist wie das von der Anzeige, dort das Zeichnen zweimal machen, einmal an der Stelle `i` und an der Stelle `i` + Anzeigebreite, und dann immer einen Ausschnitt vom Surface mit dem horizontalen Versatz `i` auf das Anzeigedisplay blitten. Wenn `i` bei der Anzeigebreite angekommen ist, kann man es so einfach wieder auf 0 zurücksetzen.
Re: Variables Fenster
Verfasst: Mittwoch 26. Mai 2010, 16:05
von majinv
hmmm, ich versteh deinen ansatz nicht ganz, was soll mir das zweite mal denn nutzen?
dann hab ich zwei kurven...
__________
|..................|
|/\/\/\/\/\........|/\/\/\/\/\
|__________|
wenn ich die jetzt verschiebe, dann ändert sich ja nichts...
Code: Alles auswählen
if i<100:
screen.blit(background,(0,0))
else:
screen.blit(background,(0-p,0))
p = p + 1
ich hab mal obiges geändert... aber das führt nicht zum gewünschten erfolg... die linie zittert nun...
ich bekomme die linie auch ab einem bestimmten punkt zum stillstand...
ich wollte damit erreichen, dass das fenster einfach nach links raus geschoben wird... aber er zeichnet komischerweise nur käse...
ich vermute den fehler bei den koordinaten des zeichnens, im zusammenhang mit dem "i"...
Re: Variables Fenster
Verfasst: Mittwoch 26. Mai 2010, 16:39
von BlackJack
@majinv: Das zweite mal hat den Nutzen, dass man am Ende des "Puffers" einfach auf den Anfang zurückspringen kann, und da exakt das gleiche Bild vorfindet wie in der zweiten Hälfte, so dass der Betrachter nichts von dem Sprung mitbekommt.
Re: Variables Fenster
Verfasst: Mittwoch 2. Juni 2010, 16:15
von majinv
mir ist das schon fast peinlich... aber bezüglich des zitterns, hab ich nun rausgefunden, woran es lag... -.-
da ich soudns auswerte... sind diese variabel... (komisch oder?^^)
naja... jedenfalls hab ich statt des counters, der das surface ins negative ziehen sollte, die normierten sound daten abgezogen^^
daher kam das "zittern"^^
wobei ich noch nicht am ziel bin... aber ich hab für heute genug python gehabt... nächste woche gehts weiter
dann setz ich nmich nochmal an deine idee... und schau, ob ich das besser hinbekomme...

Re: Variables Fenster
Verfasst: Mittwoch 16. Juni 2010, 11:09
von majinv
sers...
ich habs hinbekommen, für die die auch nach etwas ähnlichem suchen...
aber ich habs ganz anders gemacht, ich hab einfach meine daten immer wieder in
ein array geschrieben, und sobald ich in der mitte angekommen bin, das älteste rausgeworfen
und das array in jedem schritt neugezeichnet...
somit siehts genauso aus, wie ich es haben wollte
Code: Alles auswählen
def soundLevel(self):
#Create window
WIDTH = 1366
HEIGTH = 180
CENTER = 750
window = pygame.display.set_mode((WIDTH, HEIGTH))
pygame.display.set_caption('Sound level')
screen = pygame.display.get_surface()
backgroundCenter = pygame.Surface((WIDTH,HEIGTH))
backgroundCenter.fill((0,0,0))
i = 0
#2147483647.
maxm = 2247483647.
start_pos = 0.
end_pos = 0.
t = 1
first = 1
reDraw = array.array('i')
while True:
# Read data from device
l,data = inp.read()
if l:
#raw bytes
start_pos = end_pos
p = (audioop.max(data, 4))
end_pos = (int((p/maxm) * 100))
#create running screen
if len(reDraw) >= 750:
del reDraw[0]
reDraw.append(end_pos)
else:
reDraw.append(end_pos)
#delete old line
backgroundCenter.fill((0,0,0))
for a in range ( len(reDraw) ):
pygame.draw.line(backgroundCenter, (0, 127, 255), (i-1, reDraw[a-1]), (i, reDraw[a]),1)
i += 1
i = 0
screen.blit(backgroundCenter,(0,0))
#Update screen
pygame.display.flip()