Fehler beim ausführen des Python Scripts

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
Niklas Schn.
User
Beiträge: 2
Registriert: Mittwoch 3. Oktober 2018, 09:59

Hallo,
habe ein Problem mit meinem Python Script:

import pyglet
import pyglet
from pyglet.window import key
import os
import datetime
import time

def power():
if window.MENUs=="SN":
window.MENUs="SM"
else:
window.MENUs="SN"

window = pyglet.window.Window()
keys = key.KeyStateHandler()
window.push_handlers(keys)
window.startVorspulen=False
window.startRueckspulen=False
window.versucheVorspulen=False
window.versucheRueckspulen=False
window.zeitZiellauf=[0,0]
window.zeitPosition=0
window.s1="X"
window.s2=" "
window.MENUs=str ("SN")
window.start_wiedergabe=False

window.player = pyglet.media.Player()

script_dir = os.path.dirname(os.path.realpath(__file__))
musikordner = os.path.join(script_dir,'musik')
window.alleMusikOrdner = os.listdir (musikordner)
window.alleMusikOrdner = [os.path.join(musikordner,ordner) for ordner in window.alleMusikOrdner]
pyglet.resource.path = window.alleMusikOrdner
pyglet.resource.reindex()

window.aktuelleOrdnernr = 0



label = pyglet.text.Label(datetime.datetime.now().strftime("%d-%m-%y %H-%M-%S"),
font_name='Times New Roman',
font_size=20,
x=window.width//2, y=400,
anchor_x='center', anchor_y='center')
label2 = pyglet.text.Label("",
font_name='Times New Roman',
font_size=20,
x=window.width//2, y=window.width//2,
anchor_x='center', anchor_y='center')
label3 = pyglet.text.Label("",
font_size=20,
x=window.width//2, y=100,
anchor_x='center', anchor_y='center')
label4 = pyglet.text.Label("",
font_size=20,
x=window.width//2, y=50,
anchor_x='center', anchor_y='center')

@window.event
def on_draw():
window.clear()
label.draw()
label2.draw()
label3.draw()
label4.draw()

def mp3(dt):
label2.text=window.liederInOrdner[window.aktuellesLied]
label3.text=os.path.basename(window.alleMusikOrdner[window.aktuelleOrdnernr])

def update(dt):
label.text = datetime.datetime.now().strftime("%d-%m-%y %H-%M-%S")
if window.MENUs=="SN":
label2.text = ""
label3.text = ""
label4.text = ""
label4.text = "Standby"
if window.MENUs=="SM":
label2.text = "("+window.s1+")MP3 Player"
label3.text = "("+window.s2+")Bluetooth"
label4.text = ""
if window.MENUs=="MN":
window.player.delete()
window.player = pyglet.media.Player()
window.liederInOrdner = os.listdir (ordnerName)
window.liederInOrdner = [lied for lied in window.liederInOrdner if "mp3" in lied]
#print liederInOrdner
for lied in window.liederInOrdner:
window.player.queue(pyglet.resource.media(lied))
if window.start_wiedergabe==False:
window.player.play
window.start_wiedergabe=True
window.aktuellesLied=liednr
ladeOrdner(window.alleMusikOrdner[window.aktuelleOrdnernr])
mp3(dt)
time1 = int(window.player.time)
print window.player.time
print window.player.source.duration
time2 = int(window.player.source.duration)
t1s = time1 % 60
t1m = int(time1/60)
t2s = time2 % 60
t2m = int(time2/60)
label4.text = '{:02d}:{:02d}/{:02d}:{:02d}'.format(t1m,t1s,t2m,t2s)

def zeitTicker(dt):
if window.ziellauf:
if " " not in label3.text:
window.labelBackup = label3.text
if window.zeitPosition==0:
label3.text = ' :{:02d}'.format(window.zeitZiellauf[window.zeitPosition])
else:
label3.text = window.labelBackup

pyglet.clock.schedule_interval(update, 0.5)

#def ladeOrdner(ordnerName, liednr=0):
# window.player.delete()
# window.player = pyglet.media.Player()
# window.liederInOrdner = os.listdir (ordnerName)
# window.liederInOrdner = [lied for lied in window.liederInOrdner if "mp3" in lied]
# #print liederInOrdner
# for lied in window.liederInOrdner:
# window.player.queue(pyglet.resource.media(lied))
# if window.start_wiedergabe==False:
# window.player.play
# window.start_wiedergabe=True
# window.aktuellesLied=liednr

#ladeOrdner(window.alleMusikOrdner[window.aktuelleOrdnernr])

def naechstesLied():
if window.aktuellesLied < len(window.liederInOrdner)-1:
window.aktuellesLied +=1
label2.text=window.liederInOrdner[window.aktuellesLied]
window.player.next_source()
else:
window.aktuellesLied =0
label2.text=window.liederInOrdner[window.aktuellesLied]
window.player.next_source()
ladeOrdner(window.alleMusikOrdner[window.aktuelleOrdnernr])

def vorherigesLied():
if window.aktuellesLied==0:
ladeOrdner(window.alleMusikOrdner[window.aktuelleOrdnernr],len(window.liederInOrdner)-1)
label2.text=window.liederInOrdner[window.aktuellesLied]
else:
window.aktuellesLied -=1
ladeOrdner(window.alleMusikOrdner[window.aktuelleOrdnernr],window.aktuellesLied)
label2.text=window.liederInOrdner[window.aktuellesLied]

@window.event
def on_key_press(symbol, modifiers):
if symbol == key.P:
# if window.MENUs=="SN":
# window.MENUs="SM"
# else:
# window.MENUs=="SN"
power()
if symbol == key.SPACE:
if window.MENUs=="MN":
if window.player.playing:
window.player.pause()
else:
window.player.play()
elif symbol ==key.ESCAPE:
if window.MENUs=="MN":
window.MENUs="SM"
if window.MENUs=="MM":
window.MENUs="MN"
if window.MENUs=="BN":
window.MENUs="SM"
if window.MENUs=="BM":
window.MENUs="BN"
if window.MENUs=="Z":
window.MENUs="MM"
elif symbol == key.RIGHT:
if window.MENUs=="MN":
naechstesLied()
if window.MENUs=="Z":
if window.zeitPosition == 0:
window.zeitPosition = 1
elif symbol == key.LEFT:
if window.MENUs=="MN":
vorherigesLied()
if window.MENUs=="Z":
if window.zeitPosition == 1:
window.zeitPosition = 0
elif symbol == key.PLUS:
if window.MENUs=="MN":
next_dir ()
elif symbol == key.Z:
Ziellauf ()
if symbol == key.DOWN:
if window.MENUs=="SM":
window.s1=" "
window.s2="x"
if window.MENUs=="Z":
min_m = window.zeitZiellauf[0]
sec_m = window.zeitZiellauf[1]
timemax = int(window.player.source.duration)
smin = 0
mmin = 0
if sec_m==0:
s=False
else:
s=True
if min_m==0:
m=False
else:
m=True
if window.zeitPosition ==0:
if m==True:
window.zeitZiellauf[window.zeitPosition]-=1
label3.text = '{:02d}:{:02d}'.format(window.zeitZiellauf[0],window.zeitZiellauf[1])
if m==False:
label3.text = '{:02d}:{:02d}'.format(window.zeitZiellauf[0],window.zeitZiellauf[1])
if window.zeitPosition ==1:
if s==True:
window.zeitZiellauf[window.zeitPosition]-=1
label3.text = '{:02d}:{:02d}'.format(window.zeitZiellauf[0],window.zeitZiellauf[1])
if s==False:
label3.text = '{:02d}:{:02d}'.format(window.zeitZiellauf[0],window.zeitZiellauf[1])
if symbol == key.UP:
if window.MENUs=="SM":
window.s1="x"
window.s2=" "
if window.MENUs=="Z":
min_m = window.zeitZiellauf[0]
sec_m = window.zeitZiellauf[1]
timemax = int(window.player.source.duration)
smax = timemax % 60
mmax = int(timemax/60)
if sec_m<smax:
s=True
else:
s=False
if min_m<mmax:
m=True
else:
m=False
if window.zeitPosition ==0:
if m==True:
window.zeitZiellauf[window.zeitPosition]+=1
label3.text = '{:02d}:{:02d}'.format(window.zeitZiellauf[0],window.zeitZiellauf[1])
if m==False:
label3.text = '{:02d}:{:02d}'.format(window.zeitZiellauf[0],window.zeitZiellauf[1])
if window.zeitPosition ==1:
if s==True:
window.zeitZiellauf[window.zeitPosition]+=1
label3.text = '{:02d}:{:02d}'.format(window.zeitZiellauf[0],window.zeitZiellauf[1])
if s==False:
label3.text = '{:02d}:{:02d}'.format(window.zeitZiellauf[0],window.zeitZiellauf[1])
if symbol == key.ENTER:
if window.MENUs=="SM":
if window.s1=="X":
window.MENUs="MN"
if window.s2=="X":
print "Bluetooth"
if window.MENUs=="Z":
springen()
window.MENUs="MN"
label2.text=window.liederInOrdner[window.aktuellesLied]
label3.text=os.path.basename(window.alleMusikOrdner[window.aktuelleOrdnernr])
window.zeitZiellauf=[0,0]


def Ziellauf():
window.ziellauf=True
label2.text="Springe zu Zeit:"
label3.text = '--:--'
label4.text ="OK zum Bestaetigen"

def springen():
min_s = window.zeitZiellauf[0]
sec_s = window.zeitZiellauf[1]
min_s = min_s*60
Stempel = sec_s + min_s
if Stempel<window.player.source.duration:
window.player.seek(Stempel)

def next_dir():
if window.aktuelleOrdnernr<len(window.alleMusikOrdner)-1:
window.aktuelleOrdnernr +=1
ladeOrdner(window.alleMusikOrdner[window.aktuelleOrdnernr])
label3.text=os.path.basename(window.alleMusikOrdner[window.aktuelleOrdnernr])
label2.text=window.liederInOrdner[window.aktuellesLied]

else:
window.aktuelleOrdnernr =0
ladeOrdner(window.alleMusikOrdner[window.aktuelleOrdnernr])
label3.text=os.path.basename(window.alleMusikOrdner[window.aktuelleOrdnernr])
label2.text=window.liederInOrdner[window.aktuellesLied]

pyglet.app.run()

Wenn ich das Script starte und erst "P" und dann ENTER drücke, bekomme ich folgende Fehlermeldung:

Traceback (most recent call last):
File "C:\Users\niklas\Desktop\raspi_radio\ziellauf.py", line 296, in <module>
pyglet.app.run()
File "C:\Python27\lib\site-packages\pyglet\app\__init__.py", line 138, in run
event_loop.run()
File "C:\Python27\lib\site-packages\pyglet\app\base.py", line 142, in run
self._run()
File "C:\Python27\lib\site-packages\pyglet\app\base.py", line 154, in _run
timeout = self.idle()
File "C:\Python27\lib\site-packages\pyglet\app\base.py", line 275, in idle
redraw_all = self.clock.call_scheduled_functions(dt)
File "C:\Python27\lib\site-packages\pyglet\clock.py", line 346, in call_scheduled_functions
item.func(now - item.last_ts, *item.args, **item.kwargs)
File "C:\Users\niklas\Desktop\raspi_radio\ziellauf.py", line 86, in update
window.liederInOrdner = os.listdir (ordnerName)
NameError: global name 'ordnerName' is not defined
>>>

Ich hoffe, ihr könnt mir weiterhelfen!
MFG niklas schn.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Hallo Niklas,
hast du dir denn mal die Fehlermeldung angeschaut?
File "C:\Users\niklas\Desktop\raspi_radio\ziellauf.py", line 86, in update
window.liederInOrdner = os.listdir (ordnerName)
NameError: global name 'ordnerName' is not defined
Es gibt in deiner Funktion update die Zeile 86 in der du eine Variable "ordername" benutzt, die nicht definiert ist.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Niklas Schn.: Das ist sehr unübersichtlicher Code in dem alles über globale Variablen mit allem anderen zusammenhängt. Im Grund gibt es keine echte Funktion, das sind alles nur Namen für Codeabschnitte die ansonsten nicht wirklich vom Rest des Programms sauber getrennt sind. Alles was eine Funktion benötigt, ausser Konstanten, sollte als Argument übergeben werden, und nicht ”magisch” von irgendwo aus der ”Umgebung” kommen.

Auf Moduleben sollte nur Code stehen, der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Den gezeigten Code zu verstehen und nachvollziehen zu können, zum Beispiel um Fehler zu finden oder Änderungen/Erweiterungen vorzunehmen, ist viel zu aufwändig. Für den Autor selbst, wenn der nicht mehr alles frisch im Gedächtnis hat, und erst recht für fremde, wie Leser in einem Forum.

`time` wird importiert, aber nicht verwendet. `pyglet` wird direkt hintereinander zweimal importiert‽

Um binäre Operatoren und das Gleichheitszeichen bei Zuweisungen ausserhalb von Argumentlisten sollte man Leerzeichen setzen. Dann klebt das alles nicht so zusammen und ist lesbarer. Das ist eine von vielen Richtlinien aus dem [http://pep8.org Style Guide for Python Code]. Da steht auch etwas über die üblichen Namensschreibweisen (hauptsächlich klein_mit_unterstrichen und nicht camelCase).

Namen sollen dem Leser vermitteln was ein Wert bedeutet. Also keine kryptischen Abkürzungen oder völlig nichtssagende ein oder zwei Zeichen lange Namen. Wenn man Namen durchnummeriert, macht man in der Regel auch etwas falsch und möchte sich entweder passendere Einzelnamen überlegen, oder die Werte zusammen in eine Datenstruktur stecken. Oft ist das dann eine Liste.

Das mit den unverständlichen Kürzeln gilt auch für Daten. Was da an `window.MENUs` an Kürzeln gebunden wird ist auf den ersten Blick völlig unverständlich. Zudem muss man das gesamte Programm durchgehen um einen Überblick zu bekommen welche Wertemenge dort insgesamt verwendet wird. Hier könnte sich eine `enum.Enum` anbieten, mit sinnvoll benannten Elementen.

Wobei so eine Indirektion über Werte objektorientiert oft auch anders und direkter gelöst werden kann.

Namen für Funktionen und Methoden beschreiben üblicherweise die Tätigkeit die dort durchgeführt wird. `mp3()` ist keine Tätigkeit und das ist deshalb ein schlechter Name für eine Funktion.

Mit literalen Wahrheitswerten vergleicht man normalerweise nicht, denn da kommt ja nur wieder ein Wahrheitswert heraus. Entweder der den man sowieso schon hatte, oder das Gegenteil, was man mit ``not`` bekommen kann. Also statt beispielsweise ``if condition == True:`` einfach nur ``if condition:`` und statt ``if condition == False:`` oder ``if condition != True:`` schreibt man ``if not condition:``.

In der Funktion in der `ordnerName` undefiniert verwendet wird, gibt es auch noch `liednr` und `ladeOrdner` die nicht definiert sind.

Code der am Anfang oder am Ende von allen Zweigen eines ``if``(/``elif``)/``else``-Konstruktes gleich ist, sollte *einmal* vor/nach diesem Konstrukt stehen. Und natürlich macht es Sinn Code in den Zweigen so zu ordnen das dieses herausziehen möglich ist/wird.

`on_key_press()` ist viel zu lang, da werden viel zu viele unterschiedliche Sachen gemacht. Das sollte man aufteilen.

Wenn man in ``if``/``else`` einer Variablen einen Wahrheitswert zuweist der von der ``if``-Bedingung abhängt, dann braucht man kein ``if``/``else`` denn die Bedingung selbst ist ja schon ein Wahrheitswert. Also:

Code: Alles auswählen

            if sec_m == 0:
                s = False
            else:
                s = True

# <=>

            s = sec_m != 0
Wobei `s` hier kein guter Name ist und `sec_m` eigentlich auch nicht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten