Python Anfänger benötigt hilfe beim Script

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
onkelflo
User
Beiträge: 5
Registriert: Dienstag 25. März 2014, 15:15

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 

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.
onkelflo
User
Beiträge: 5
Registriert: Dienstag 25. März 2014, 15:15

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)

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. :-)
onkelflo
User
Beiträge: 5
Registriert: Dienstag 25. März 2014, 15:15

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:
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.
onkelflo
User
Beiträge: 5
Registriert: Dienstag 25. März 2014, 15:15

Sorry, meine Programmierkenntnisse sind leider eingerostet, und genau das will ich wieder ändern :(
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Oder wie man vergisst sich hinzusetzen[1].

[1] http://www.youtube.com/watch?v=Wm-z-GIlYr0
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
onkelflo
User
Beiträge: 5
Registriert: Dienstag 25. März 2014, 15:15

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 :-(
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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?
Das Leben ist wie ein Tennisball.
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@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)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten