def in def will andere def nicht öffnen

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
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

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
Zuletzt geändert von Andyh am Sonntag 17. Februar 2008, 15:43, insgesamt 1-mal geändert.
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.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

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
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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 ;)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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! :(
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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 ;)
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 ;)
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

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
Zuletzt geändert von Andyh am Montag 18. Februar 2008, 18:19, insgesamt 1-mal geändert.
lunar

Sternchen-Import entfernen, globals entfernen, geschachtelte Funktionen entfernen. Dann verschwindet auch das Problem.
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.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

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
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.
Keanuf
User
Beiträge: 39
Registriert: Freitag 3. Oktober 2003, 00:03
Kontaktdaten:

Hier ein Link zu einem Buch
http://www.galileocomputing.de/openbook/oo/

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

-/-

Edit: Richtige Kritik zum falschen Buch gelöscht. :oops:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Woll'ma das auch verreißen? :twisted:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten