Seite 1 von 1

def in def will andere def nicht öffnen

Verfasst: Sonntag 17. Februar 2008, 15:26
von Andyh
Hallo

Ich habe mal wieder ein tolles Problem, besonders weil ich weiss das es geht es aber nicht will.

Code: Alles auswählen

            def laden():
                print "Laden Dialog geöffnet"
                
                def laden1(datei1 = "data"):
                    
                    global datei2
                    datei2 = datei1
                    try:
                        datei = file(datei2, "r")
                        global line
                        for line in datei.readlines():
                            neuladen(datei2)
                            print line
                        print "Datei geladen"
                            
                    except:
                        print "Ladefehler"
                    
                    print" "
                       
                fenster2=Toplevel() 
                fenster2.geometry('500x300')
                fenster2.title('Turbo-NC 1.0 Beta!!! PRG laden')
                fenster2.label=Label(fenster2,text='Programm einladen', font= font0) 
                fenster2.label.pack() 
                fenster2.label2=Label(fenster2,text='Das Programm muss eine .txt sein und muss',font= font1) 
                fenster2.label2.pack()
                fenster2.label3=Label(fenster2,text='im Programmverzeichnis sein              ',font= font1) 
                fenster2.label3.pack()
                e1=Entry(fenster2, font = font1) 
                e1.pack() 
                fenster2.button1=Button(fenster2,text='Bestätigen',font = font2, command=lambda: laden1(str(e1.get())))                                        
                fenster2.button1.pack()    
                fenster2.mainloop()

            def neuladen(datei2):
                fenster.listbox.insert(END, datei2)
Falls euch der code bekannt vorkommt: ja ist auch so

Das Problem ist in Zeile 12 die def neuladen(datei2) wird nicht gefunden(NameError: name 'neuladen' is not defined).

Die def neuladen kommt erst danach, wurde aber schon einmal überlesen.
Es macht auch keinen unterschied ob sie davor steht.

Achso sie steht in gleicher reihe wie def laden()

Gruß
Andyh

Verfasst: Sonntag 17. Februar 2008, 15:35
von BlackJack
Tja also ich sehe nicht wo der Name `neuladen` herkommen sollte. Python sieht das anscheinend genau so.

Und die ``global``\s sehen krank bis gefährlich aus.

Verfasst: Sonntag 17. Februar 2008, 15:41
von Andyh
Hallo

Ich wollte die neuladen nicht auch noch mit rein stecken(wegen der Länge)

hab sie reingemacht (nur die ersten 2 zeilen der rest steht eh in try)

Gruß
Andyh

Verfasst: Montag 18. Februar 2008, 09:38
von Zap
Warum sind die Methoden eigentlich so unglaublich weit nach rechts gerückt? .. das lässt nichts gutes erahnen.
Ich meine auch das wir dir schonmal empfohlen haben von Funktionen bzw Methoden zu reden und nicht von "def's".
Vielleicht zeigst du uns mal das Modul in seiner ganzen schönheit und bist in Zukunft ein bisschen weniger Beratungsresistent ;)

Verfasst: Montag 18. Februar 2008, 11:04
von audax
Ich sehe da oben ein 'from Tkinter import *' und ein einzelnes 'except' gibts auch dort. Und ich wette, er arbeitet mit IDLE.

Python sorgt in keinster Weise für guten Code! :(

Verfasst: Montag 18. Februar 2008, 12:29
von Y0Gi
audax hat geschrieben:Python sorgt in keinster Weise für guten Code! :(
Für guten Code kann nur der Entwickler selbst sorgen. Für lesbaren Code sorgt Pythons Syntax im Rahmen ihrer Möglichkeiten durchaus, aber auch da ist der Entwickler gefragt, vernünftig damit umzugehen. Und jetzt stell' dir obigen Code und dessen Formatierungsliebe nochmal in anderen Programmiersprachen vor ;)

Verfasst: Montag 18. Februar 2008, 17:25
von lunar
Y0Gi hat geschrieben:Und jetzt stell' dir obigen Code und dessen Formatierungsliebe nochmal in anderen Programmiersprachen vor ;)
Python erzwingt wenigstens noch Einrückungen. Bei anderen Sprachen muss man den Anfängern sowas überhaupt erstmal mühsam beibringen ;)

Verfasst: Montag 18. Februar 2008, 17:30
von Andyh
Hallo

Ja schön ist was anderes(ist ja erst mal nur ein test). Ich werde das noch änderen, damit ich auch noch in 2 Jahre noch durchblicke.

Den Code lagere ich nach der Pizza die gerade aus dem Offen kommt aus :D

CODE: http://paste.pocoo.org/show/28643/

Ja ich habe einen * import

Gruß
Andyh der jetzt immer schön Funktion schreibt

Verfasst: Montag 18. Februar 2008, 17:38
von lunar
Sternchen-Import entfernen, globals entfernen, geschachtelte Funktionen entfernen. Dann verschwindet auch das Problem.

Verfasst: Montag 18. Februar 2008, 17:44
von BlackJack
Der Kommentar ist herrlich:

Code: Alles auswählen

#!!!!!Alle Variablen immer als global kenzeichnen!!!!!
Du hast keine einzige richtige Funktion geschrieben. Funktionen bekommen Werte als Argumente und geben Ergebniss als Rückgabewerte zurück. Du hast nur Codeabschnitten, die globale Variablen benutzen, Namen gegeben.

Und es gibt tatsächlich kein `neuladen()` als Funktion. Das ist eine "Methode" der "Klasse" `fenster`. Die da mal sehr komisch platziert ist, und soweit ich das sehe wird auch nie eine Instanz davon erzeugt.

Verfasst: Montag 18. Februar 2008, 18:52
von Andyh
Hallo

Danke erstmal! Ich habe den Code ein bischen umstrukturiert.
* import ist erst mal geblieben(kommt noch weg, aber nicht mehr heute)
Funktionen sind entschachtelt

http://paste.pocoo.org/show/28649/

Was ist an globalen Variablen eigentlich so schlecht? Ich finds ganz nützlich.

Aber geht immer noch nicht.

Fehler:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
return self.func(*args)
File "C:/Python25/CNC neu/Tkinker test1.py", line 85, in <lambda>
fenster2.button1=Button(fenster2,text='Bestätigen',font = font2, command=lambda: laden1(str(e1.get())))
NameError: global name 'laden1' is not defined

Noch eine Frage:

Wie könnte ich das noch besser strukturieren? (will ja was lehrenen)

Gruß
Andyh

Verfasst: Montag 18. Februar 2008, 18:59
von Leonidas
Andyh hat geschrieben:* import ist erst mal geblieben(kommt noch weg, aber nicht mehr heute)
Antwort kommt auch, aber auch nicht mehr heute.
Andyh hat geschrieben:Was ist an globalen Variablen eigentlich so schlecht? Ich finds ganz nützlich.
Sie machen den Programmfluss übersiichtlich. Das wird in MITs 600.1 gleich in der ersten Stunde gelehrt. Ausführliche Antwort kommt dann morgen.

Verfasst: Montag 18. Februar 2008, 19:03
von CM
Hoi,
Andyh hat geschrieben:Was ist an globalen Variablen eigentlich so schlecht? Ich finds ganz nützlich.
[wiki=Die_global-Anweisung]Das ist zwar nicht ganz, was ich schreiben würde, trifft aber den Punkt durchaus.[/wiki]

Gruß,
Christian

Verfasst: Montag 18. Februar 2008, 19:08
von Andyh
Hallo

Gut ihr habt mich überzeugt "global kommt nicht mehr ins Haus"
Antwort kommt auch, aber auch nicht mehr heute.
Ausführliche Antwort kommt dann morgen.
Das wahr nicht böse gemeint , ich muss halt auch noch was anderes tuhen. Komme immer um 17 Uhr von der Arbeit und "sollte" um 22 Uhr wieder schlafen, und jeder von euch weiss was man alles halt so machen muss.

Gruß
Andyh

Verfasst: Montag 18. Februar 2008, 19:13
von lunar
* import ist erst mal geblieben(kommt noch weg, aber nicht mehr heute)
Dieser Import ist momentan auch dein geringstes Problem.
Funktionen sind entschachtelt
Nichts ist entschachtelt:

Code: Alles auswählen

class programm
 |
 +-> def __init__
 |
 +-> def run
      |
      +-> class fenster
           |
           +-> def laden1
           |
           +-> def neuladen
           |
           +-> def testfenster
           |
           +-> def laden
Wie könnte ich das noch besser strukturieren? (will ja was lehrenen)
Kauf dir ein Buch über objektorientierte Programmierung und lese es durch. Dadurch lernst du mehr als wenn dir jemand dieses Programm vorkauen würde.

Verfasst: Montag 18. Februar 2008, 21:50
von Keanuf
Hier ein Link zu einem Buch
http://www.galileocomputing.de/openbook/oo/

kaufen ist immer besser, da hier der Autor auch was davon hat ;)

Verfasst: Montag 18. Februar 2008, 22:05
von BlackJack
-/-

Edit: Richtige Kritik zum falschen Buch gelöscht. :oops:

Verfasst: Montag 18. Februar 2008, 23:27
von Leonidas
Woll'ma das auch verreißen? :twisted: