Tkinter

Fragen zu Tkinter.
Antworten
ertlpott
User
Beiträge: 44
Registriert: Montag 14. April 2003, 16:05

Habe mich jetzt ein bischen in Tkinter eingelesen und wollte erstmals mit einer GUI ein kleines Prog aus meinem Buch umsetzen.
Nur bin ich da auf ein paar kleine Fragen gestoßen:

zB:
Ich habe fünf Textfelder. Davon sind vier als Entry Klassen, und eins als Text klasse spezifiziert.
Unten klebt ein Button, der beim Draufklicken den Inthalt aller Felder auf einmal löscht.
Dieser Button ist mit einer Funktion belegt die folgendermaßen aussieht:

Code: Alles auswählen

namen = ("Name","E_mail","Postanschrift","Typ","Texter")


def loeschen():
	for name in namen:
		exec name+".delete(0,END)"
Texter ist hier die Textklasse
Der Löschprozess funktioniert bei allen Entryfeldern problemlos. Nur bei der Text-Klasse bekomme ich eine Fehlermeldung zurück von wegen "Tcl Error: bad Index "0"

Falls mir jemand sagen kann wie der Befehl bei der Text-Klasse anders lauten sollte, wäre mir sehr geholfen.

Grüße

Simon
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Also, da gibts gleich mehrere Sachen zu sagen: Der grund warum er "0" nicht akzeptiert ist einfach. Entrys sind einzeilig, Textfelder mehrzeilig. also muss man angeben, von wo aus gelöscht werden soll. Das erste Zeichen wird mit "1.0" markiert.

Dann würde ich auf exec verzichten und lieber so vorgehen (warum halt erst die Namen nehmen, wenn gleich die Objekte möglich sind?):

Code: Alles auswählen

namen = (Name,E_mail,Postanschrift,Typ,Texter)

def loeschen():
    for i in namen:
        if isinstance(i, Tkinter.Entry):
            i.delete(0,END)
        if isinstance(i,Tkinter.Text):
            i.delete("1.0","end")
Und: bei grafischen Sachen, also Tkinter und konsorten im GUI-Forum schreiben ;)
ertlpott
User
Beiträge: 44
Registriert: Montag 14. April 2003, 16:05

Das Problem mit dem Tuple ist jedoch, dass ich will, dass die Objekte aus ihm heraus generiert werden. Doch ich kann die Objekte doch nicht schon in dem Tuple zusammenfassen, wenn sie noch nicht mal definiert sind. Deshalb die Strings.
Oder gibt es doch eine Möglichkeit Verweise in einem Tuple zusammenzufassen, die zuerst auf gar nichts verweisen? :?

Aber danke für den Tip mit dem Textfeld

Grüße

Simon
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Nö, die Möglichkeit gibts nicht. Du kannst höchstens alle Namen in ein Dictionary mit dem Wert None schreiben und bei der Erstellung die Objekte eintragen und das dict dann in der Funktion nehmen. Das würde ich dann aber doch eher als Verränkung empfinden (zumindest bei kleinen Scripten, bei großen hat das durchaus Sinn 8)) und dann lieber das hier machen:

Code: Alles auswählen

namen = ("Name","E_mail","Postanschrift","Typ","Texter")

def loeschen(): 
  for i in namen:
    obj=eval(i)
    if isinstance(obj, Tkinter.Entry): 
      i.delete(0,END) 
    if isinstance(obj,Tkinter.Text): 
      i.delete("1.0","end")
Nachtrag: ist mir gerade eingefallen, wozu ein Dict, wenns dann auch ne Liste tun würde, wo man dann Objekte nach der Erstellung reinschreibt?
ertlpott
User
Beiträge: 44
Registriert: Montag 14. April 2003, 16:05

Mein Ziel ist aber, dass die Objekte aus eben dem Tuple bzw. der Liste heraus generiert werden.

Deswegen rufe ich auch nach dem generieren eine Funktion auf, die die Strings in Verweise umwandelt und diese als Liste zurückgibt.
Antworten