Seite 1 von 1

TK und Module?

Verfasst: Donnerstag 9. April 2009, 15:02
von search
Hallo zusammen, ich mache gerade meine ersten Versuche mit Tkinter und habe da jetzt ein Problem wo ich einfach nicht weiterkomme:
Ich habe eine Hauptdatei, wo der ganze Programmablauf aufgeführt ist, und dann noch eine weitere Datei in der die ganzen Funktion als Module gesammelt sind, die von der Hauptdatei Importiert wird. Meine Frage ist nun, wenn ich z.B. einen Button habe der eine Funktion startet, wie hier im Beispiel der Button...

Code: Alles auswählen

 Hauptdatei: tk_krypto.py
from Tkinter import *
import tk_krypto_modul, ...
...
label = Label (top, text = '')
text = Text(top, wrap=WORD, yscrollcommand=scrollbar.set)
text.pack()
scrollbar.config(command=text.yview)
button = Button(top, text = 'Text einlesen...',  command = tk_krypto_modul.load)
...


Datei: tk_krypto_modul.py
...
def load():
    text.delete(1.0, END)
    file= tkFileDialog.askopenfilename(initialdir = '/home')
    lesen = krypto_modul.datei_open(file)
    text.insert(END, lesen)
    button1.config(top, state=NORMAL)
...
Also der >Button startet die Funktion load(), zum öffnen einer Datei, vorher soll aber noch das Textfeld (das im Hauptprogramm gestartet worden ist) bereinigt werden, um dann den neuen Text einzulesen. Aber wenn ich das so mache bekomme ich immer die Meldung...

Code: Alles auswählen

 File "/home/search/python_prog/krypto_v11-v1.9/tk_krypto_modul.py", line 7, in load
    text.delete(1.0, END)
NameError: global name 'text' is not defined
Wie kann ich der Funktion denn nun sagen, dass >text< ja schon im Hauptprogramm
läuft?? Oder mache ich jetzt einen Fehler??

Verfasst: Donnerstag 9. April 2009, 16:40
von EyDu
Das willst du gar nicht tun, damit vermischt du nu Logik und Anzeige. Was du eigentlich möchtest ist eine Funktion in deinem Hauptmodul, welche den Text löscht und dann die load-Funktion aufruft.

Noch ein paar kurze Anmerkungen, hab nur ganz kurz den Code überflogen:
- Lass die *-Importe bleiben, auch bei Tkinter
- Warum steht bei allen Modulen ein "tk_" voran? Nur weil du Tk verwendest, solltes du deine Module nicht damit kennzeichnen, sonder damit was die Module machen .
- Du solltest nichts an den Namen "file" binden, da du so ein built-in verdeckst
- Die Leerzeichen bei den Zuweisungen gehören weg "name = value" => "name=value"

Verfasst: Donnerstag 9. April 2009, 17:01
von numerix
EyDu hat geschrieben:Die Leerzeichen bei den Zuweisungen gehören weg "name = value" => "name=value"
Nur damit er das nicht missversteht:
Das gilt nur für die Schlüsselwortparameter. Ansonsten gehören da schon Leerzeichen hin:
http://www.python.org/dev/peps/pep-0008/

Verfasst: Donnerstag 9. April 2009, 17:39
von EyDu
Stimmt, das hätte ich besser formulieren sollen.

Verfasst: Donnerstag 9. April 2009, 18:04
von search
Hallo,
erst mal Danke für die schnelle Antwort. Das mit den *Import dachte ich mir schon, habe hier auch schon die Diskussion ein bischen verfolgt. Habe alles geändert, danke!
Bei meinen Modulen steht kein tk_ davor, das sind nur meine beiden Dateien... die Hauptdatei und die mit den Modulen darin! Wenn das alles läuft werde ich das eh noch ändern, aber ich werde in Zukunft daran denken.
Das mit dem Namen file war ein fehler von mir!!
Leerzeichen ist notiert, danke.

Und sonst zu meinem Problem? Sollte ich da vielleicht eine >Event-Verarbeitung rein Programmieren? Werde das mal probieren.

Verfasst: Donnerstag 9. April 2009, 19:47
von Leonidas
Ich verweise jetzt einfach nur auf [wiki]Import[/wiki].

Verfasst: Donnerstag 9. April 2009, 22:12
von BlackJack
@search: Modul == Datei, also fangen Deine Modulnamen doch mit `tk_` an. Und Du hast keine Datei mit Modulen darin. So etwas kann man theoretisch machen, indem man Module in einem Modul dynamisch erstellt, aber das ist eher ungewöhnlich und macht in der Regel keinen Sinn.

Verfasst: Freitag 10. April 2009, 16:25
von search
OK, dann habe ich das nur falsch verstanden. Danke!!