Seite 1 von 1

Variables Fenster

Verfasst: Mittwoch 26. Mai 2010, 14:09
von majinv
Sers :-)

ich wieder :-P

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 :D

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()