Variables Fenster

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
majinv
User
Beiträge: 42
Registriert: Mittwoch 14. April 2010, 13:21

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?
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.
majinv
User
Beiträge: 42
Registriert: Mittwoch 14. April 2010, 13:21

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"...
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.
majinv
User
Beiträge: 42
Registriert: Mittwoch 14. April 2010, 13:21

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... :)
majinv
User
Beiträge: 42
Registriert: Mittwoch 14. April 2010, 13:21

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