Seite 1 von 1

Python Anfänger benötigt hilfe beim Script

Verfasst: Dienstag 25. März 2014, 20:23
von onkelflo
Hallo zusammen,

erstmal möchte ich mich kurz vorstellen, ich bin Informatiker vom Beruf aber zuletzt richtig Programmiert habe ich wohl vor 10 Jahren. Meine Sprachen waren damals Java und C++.

Durch meinen Raspberry bin ich wieder zum programmieren gekommen. Ich habe ein Script von Adafruit genommen was auch sehr gut läuft. Ich möchte das Script für meine Bedürfnisse anpassen, und zwar das die Ausgabe einmal durchläuft und das danach das Script beendet wird. Probiert habe ich das durch eine Zählschleife, aber irgendwie mache ich wohl noch einen dummen Fehler :-(

Daher wäre ich dankbar, wenn mir jemand meinen Fehler aufzeigt :)

Und hier das Script:

Code: Alles auswählen

#!/usr/bin/env python 
# Light painting / POV demo for Raspberry Pi using
# Adafruit Digital Addressable RGB LED flex strip.
# ----> http://adafruit.com/products/306
from bootstrap import * 
import RPi.GPIO as GPIO, Image, time
 
# Configurable values
filename  = "fry.jpg"
dev       = "/dev/spidev0.0"
dl	  = 1 
# Open SPI device, load image in RGB format and get dimensions:
spidev    = file(dev, "wb")
print "Loading..."
img       = Image.open(filename).convert("RGB")
pixels    = img.load()
width     = img.size[0]
height    = img.size[1]
print "%dx%d pixels" % img.size
# To do: add resize here if image is not desired height
 
# Calculate gamma correction table.  This includes
# LPD8806-specific conversion (7-bit color w/high bit set).
gamma = bytearray(256)
for i in range(256):
	gamma[i] = 0x80 | int(pow(float(i) / 255.0, 2.5) * 127.0 + 0.5)
 
# Create list of bytearrays, one for each column of image.
# R, G, B byte per pixel, plus extra '0' byte at end for latch.
print "Allocating..."
column = [0 for x in range(width)]
for x in range(width):
	column[x] = bytearray(height * 3 + 1)
 
# Convert 8-bit RGB image into column-wise GRB bytearray list.
print "Converting..."
for x in range(width):
	for y in range(height):
		value = pixels[x, y]
		y3 = y * 3
		column[x][y3]     = gamma[value[2]]
		column[x][y3 + 1] = gamma[value[0]]
		column[x][y3 + 2] = gamma[value[1]]
 
 
# Then it's a trivial matter of writing each column to the SPI port.
print "Displaying..."
while True:
     if dl < 2:	
	for x in range(width):
                spidev.write(column[x])
                spidev.flush()
		time.sleep(0.101)
	time.sleep(3.5)        
      dl = dl + 2 


Re: Python Anfänger benötigt hilfe beim Script

Verfasst: Dienstag 25. März 2014, 20:39
von BlackJack
@onkelflo: Wann/Wodurch denkst Du denn wird die ``while``-Schleife in Zeile 48 ff. verlassen?

Deine Schleifen sind grösstenteils „unpythonisch”. Man kann in Python *direkt* über Elemente von Listen iterieren, ohne den Umweg über einen Index. Also ``for item in sequence:`` statt ``for i in xrange(len(sequence)):`` nur um `i` dann zu verwenden um an das Element zu kommen.

Edit: Das kompiliert nicht mal weil die Einrückung nicht stimmt. Das kann also kein Code sein den Du tatsächlich laufen lassen hast.

Re: Python Anfänger benötigt hilfe beim Script

Verfasst: Dienstag 25. März 2014, 20:43
von onkelflo
Der Code der funktioniert sieht so aus:

Code: Alles auswählen

#!/usr/bin/python
 
# Light painting / POV demo for Raspberry Pi using
# Adafruit Digital Addressable RGB LED flex strip.
# ----> http://adafruit.com/products/306
 
import RPi.GPIO as GPIO, Image, time
 
# Configurable values
filename  = "fry.jpg"
dev       = "/dev/spidev0.0"
 
# Open SPI device, load image in RGB format and get dimensions:
spidev    = file(dev, "wb")
print "Loading..."
img       = Image.open(filename).convert("RGB")
pixels    = img.load()
width     = img.size[0]
height    = img.size[1]
print "%dx%d pixels" % img.size
# To do: add resize here if image is not desired height
 
# Calculate gamma correction table.  This includes
# LPD8806-specific conversion (7-bit color w/high bit set).
gamma = bytearray(256)
for i in range(256):
	gamma[i] = 0x80 | int(pow(float(i) / 255.0, 2.5) * 127.0 + 0.5)
 
# Create list of bytearrays, one for each column of image.
# R, G, B byte per pixel, plus extra '0' byte at end for latch.
print "Allocating..."
column = [0 for x in range(width)]
for x in range(width):
	column[x] = bytearray(height * 3 + 1)
 
# Convert 8-bit RGB image into column-wise GRB bytearray list.
print "Converting..."
for x in range(width):
	for y in range(height):
		value = pixels[x, y]
		y3 = y * 3
		column[x][y3]     = gamma[value[2]]
		column[x][y3 + 1] = gamma[value[0]]
		column[x][y3 + 2] = gamma[value[1]]
 
 
# Then it's a trivial matter of writing each column to the SPI port.
print "Displaying..."
while True:
	for x in range(width):
                spidev.write(column[x])
                spidev.flush()
		time.sleep(0.101)
	time.sleep(3.5)


Re: Python Anfänger benötigt hilfe beim Script

Verfasst: Dienstag 25. März 2014, 20:46
von BlackJack
@onkelflo: Die Frage bleibt die gleiche. Was denkst Du was die ``while``-Schleife in Zeile 49 macht. Wann/Wodurch wird die verlassen?

Edit: Die `bytearray`\s machen nicht wirklich Sinn. Da kann man einfach Listen nehmen.

Edit2: Wenn Du die Antwort zu der Frage mit der ``while``-Schleife gefunden hast, nicht vergessen die Gerätedatei auch wieder zu schliessen. :-)

Re: Python Anfänger benötigt hilfe beim Script

Verfasst: Dienstag 25. März 2014, 20:55
von onkelflo
Die While Schleife in Zeile 49, sollte den LED Strip so oft leuchten lassen, wie die breite des JPG's ist. Aber genau das ist mein Problem, sie wird nicht beendet. :roll:

Re: Python Anfänger benötigt hilfe beim Script

Verfasst: Dienstag 25. März 2014, 21:37
von BlackJack
@onkelflo: Warum sollte sie denn auch beendet werden? Weisst Du echt nicht wie ``while``-Schleifen funktionieren? Das ist doch in C++ und Java genau so.

Re: Python Anfänger benötigt hilfe beim Script

Verfasst: Dienstag 25. März 2014, 22:15
von onkelflo
Sorry, meine Programmierkenntnisse sind leider eingerostet, und genau das will ich wieder ändern :(

Re: Python Anfänger benötigt hilfe beim Script

Verfasst: Mittwoch 26. März 2014, 08:43
von Hyperion
onkelflo hat geschrieben:Sorry, meine Programmierkenntnisse sind leider eingerostet, und genau das will ich wieder ändern :(
Dann schnapp Dir das Python-Tutorial und fange an! :-)

Dazu öffnest Du einfach eine Python-Shell und probierst Dinge aus; gerade für solche "Spielereien" sind REPLs ein Traum!

Wobei ich tatsächlich ein wenig geschockt bin, wie man die Funktionsweise einer ``while``-Schleife vergessen kann... bist Du sicher, dass Du wirklich programmiert hast und nicht nur Übungsaufgaben "abgetippt"?

Aber man kann das ja alles (wieder) lernen :-)

Re: Python Anfänger benötigt hilfe beim Script

Verfasst: Mittwoch 26. März 2014, 11:36
von darktrym
Oder wie man vergisst sich hinzusetzen[1].

[1] http://www.youtube.com/watch?v=Wm-z-GIlYr0

Re: Python Anfänger benötigt hilfe beim Script

Verfasst: Mittwoch 26. März 2014, 16:38
von onkelflo
Schade das man nicht einfach mal eine klare hilfe bekommt, sondern das man lieber in eine unnötige Diskussion führen muss mit typischen Aussagen wie "setzt dich und und lerne". Wenn dafür das Forum hier ist, dann bin ich hier falsch... Ich habe eine klare Frage gestellt, die nicht beantwortet werden will :-(

Re: Python Anfänger benötigt hilfe beim Script

Verfasst: Mittwoch 26. März 2014, 16:42
von EyDu
Warum sollte man dir helfen, wenn du nicht einmal die Grundlagen lernen willst? Wenn du die Grundlagen nicht verstehst, dann kann man dir das Programm gleich diktieren. Dann hast du allerdings genau Null gelernt und kommst mit der nächsten billigen Frage. Im Endeffekt hat dann keine Seite etwas davon.

Sieh es mal so: Wenn dir die Motivation zur Selbsthilfe fehlt, woher sollten andere die Motivation nehmen dir zu helfen?

Re: Python Anfänger benötigt hilfe beim Script

Verfasst: Mittwoch 26. März 2014, 18:37
von BlackJack
@onkelflo: Die klare und wirklich hilfreiche Antwort ist: Arbeite ein Tutorial durch. Dir wird hier sicher niemand die absolut grundlegensten Kontrollstrukturen wie Schleifen erklären, also letztendlich Text schreiben, der in *jedem* Anfängertutorial bereits steht. In der Python-Dokumentation ist ein Tutorial, man muss also noch nicht einmal lange suchen um eines zu finden.

Re: Python Anfänger benötigt hilfe beim Script

Verfasst: Mittwoch 26. März 2014, 21:32
von Hyperion
@onkelflo: Ich verstehe nicht, wie jemand, der professionell als Informatiker Geld verdient sich so dermaßen über sinnvoll und nett formulierte Antworden aufregen kann‽ Darüber hinaus wirkt so eine Aussage auch wenig glaubhaft, wenn sich das hier in Erinnerung ruft:
onkelflo hat geschrieben: ich bin Informatiker vom Beruf aber zuletzt richtig Programmiert habe ich wohl vor 10 Jahren. Meine Sprachen waren damals Java und C++.
Zum einen denke ich nicht, dass man die Funktionsweise einer ``while``-Schleife überhaupt vergessen kann, wenn man sie einmal gelernt hat, zum andere wirst Du doch damit in Deinem Beruf sicherlich tag täglich konfrontiert. Auch wenn man nicht programmiert, hat man doch als Informatiker immer in irgend einer Form mit Konzepten wie Schleifen, Bedingungen usw. zu tun‽ Der Transfer zwischen Konzept und konkreter Syntax in einer spezifischen Sprache sollte doch dann recht einfach gehen...

Und sind wir mal ehrlich:

Code: Alles auswählen

while True:
kann man doch sogar einfach nur übersetzen und kapiert, was das Dinge macht 8)