prob mit Entry

Fragen zu Tkinter.
Antworten
Blackfankie
User
Beiträge: 16
Registriert: Sonntag 20. Juli 2003, 00:36

hi,

Ich habe folgende Frage:

Code: Alles auswählen


from Tkinter import *
root=Tk()
eingabe=Entry(root,width=20)
eingabe.grid()
but=Button(root,text="Was ist da los???",command=eingabe.insert(END,"Was ist das???"))
but.grid()


Was pasiert ist: Das Prog startet und in dem Eingabefenster erscheint gleich "Was ist das???" und nicht erst wenn ich denn Button "Was ist da los???" betetige. Warum ist das so???
Ich dachte eigentlich das der Parameter command erst ausgeführt wird wenn der Button betetigt wird.

MFG

Blackfankie
Bugfix [Gast]

Das liegt daran weil der Command einmal durchläuft beim Initialisieren.
Setzt einfach mal über die "root.mainloop()" ein eingabe.delete(0,END) - bzw gib dem ganzen eine Variable (eintrag = Tkinter.StringVar() ).

Gute Nacht,
Bugfix
Blackfankie
User
Beiträge: 16
Registriert: Sonntag 20. Juli 2003, 00:36

ho,

>Das liegt daran weil der Command einmal durchläuft beim Initialisieren.

Das heißt also das alle angaben die ich command über gebe auch gleich beim ersten start angezeigt werden ???

>Setzt einfach mal über die "root.mainloop()" ein eingabe.delete(0,END)

Meindest du so???

Code: Alles auswählen

from Tkinter import * 
root=Tk() 
eingabe=Entry(root,width=20) 
eingabe.grid() 
but=Button(root,text="Was ist da los???",command=eingabe.insert(END,"Was ist das???")) 
but.grid() 
eingabe.delete(0,END)    # das loescht das Feld
root.mainloop()
Prob der Button hat hinterher über haupt keine Wirkung mehr.
Das Feld bleibt einfach lehr.
Meine Absicht ist aber eigentlich das der Button nur dann in aktion trit wenn der betetigt wird.

> bzw gib dem ganzen eine Variable (eintrag = Tkinter.StringVar() ).

Das verstehe ich nicht ganz für was sollen die 2 Klassen Tkinter.StringVar() stehen.

MFG

Blackfankie
Bugfix
User
Beiträge: 30
Registriert: Mittwoch 9. Juli 2003, 15:58

Tkinter.StringVar sagt aus das es eine Variable ist, die Tkinter verwendet, wäre zum Beispiel bei einem Label (dynamisches Textändern), nur geht es hier schlecht...
Tkinter.StringVar lässt sich nur verwenden wenn man den "import Tkinter" verwendet, dann fehlt allerdings auch vor jedem Element das Tkinter (Tkinter.Button usw...) .

Das mit dem Initialiseren kann ich mir nicht anders erklären, da der Text auch gleich erscheint ohne darauf zu klicken. :roll:

Hab da mal was geändert :

Code: Alles auswählen

from Tkconstants import *
from Tkinter import *

def textsetzen(): #Funktion für Button
    eingabe.insert(END,"Was ist das???")

eintrag='' # leer definieren damit Entry keine Fehler meldet

root=Tk()
eingabe=Entry(root,width=20,text=eintrag) 
eingabe.grid() 
but=Button(root,text="Was ist da los???",command=textsetzen)
but.grid() 
root.mainloop()
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

So ists eigentlich die sauberere Lösung (mit eigener Funktion):

Code: Alles auswählen

from Tkinter import *
root=Tk()

eingabe=Entry(root,width=20)
eingabe.grid()

def write_entry():
    eingabe.insert(END,"Was ist das???")

but=Button(root,text="Was ist da los???", command=write_entry)
but.grid()

root.mainloop() 
Wie Blackfankie bereits geschrieben hat, wird jeder Code hinter einem Widget-command bereits beim erstellen des jeweiligen Widgets ausgeführt wenn es mehr wie der reine Funktionsname ist!
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi, zuerst mal hab ich das verschoben, ist ein GUI-Problem.

Code: Alles auswählen

but=Button(root,text="Was ist da los???",command=eingabe.insert(END,"Was ist das???"))
Dann übergibst du keine Funktion, sondern einen Wert, da du die Funktion sofort ausführst. (eingabe.insert(END,"Was ist das???")) Du willst also, dass der Text am Ende eingefügt wird, aber du darfts das nicht so übergeben, da hier die Funktion ausgeführt wird, den Wert None liefert und der Button praktisch kein Kommando besitzt. (Durch das einmalige ausführen beim erstellen, hat dein Entry auch den Text). Es gibt zwei Möglichleiten, das trotzdem zu machen: Eine neue Funktion, oder ein lambda-Ausdruck:
  1. Code: Alles auswählen

    def einfuegen():
        eingabe.insert(END,"Was ist das???")
    but=Button(root,text="Was ist da los???",command=einfuegen)
  2. Code: Alles auswählen

    but=Button(root,text="Was ist da los???",command=lambda :eingabe.insert(END,"Was ist das???"))
Bugfix
User
Beiträge: 30
Registriert: Mittwoch 9. Juli 2003, 15:58

Danke Milan, das mit dem Lamba (ist eh irgendwie Konfus dieser Begriff) habe ich noch nicht gewusst :)
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Bugfix hat geschrieben:Danke Milan, das mit dem Lamba (ist eh irgendwie Konfus dieser Begriff) habe ich noch nicht gewusst :)
Das ist nix anderes als eine Funktion, die nur Werte berechnen kann, aber in der keine Zuweisungen erfolgen können. Das schöne daran ist, man muss ihr keinen Namen geben.

Code: Alles auswählen

def berechne(x=2):
    return x+3
berechne2=lambda x=2:x+3
Blackfankie
User
Beiträge: 16
Registriert: Sonntag 20. Juli 2003, 00:36

hi,

Sehr aufschlußreich danke :-)

Aber ich habe trotzdem noch ein prob.

Code: Alles auswählen


form Tkinter import *

def ausgabe(w):                # was ja nur einmal ausgeführt wird und dann none liefert
      eingabe.insert(END,w)

root=Tk()

eingabe=Entry(root,width=20)
eingabe.grid()

but1=Button(root,text="Gebe eine eins aus!",command=ausgabe("1"))
but1.grid()

but2=Button(root,text="Gebe eine zwei aus!",command=ausgabe("2"))
but2.grid()

but3=Button(root,text="Gebe eine drei aus!",command=ausgabe("3"))
but3.grid()

# et cetera
root.mainloop()
Gibt es für das auch noch eine Möglichkeit oder muß ich für jedes command immer wider eingabe.insert(END,"*") schreiben ???

MFG

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

so wie es jetzt ist auf jeden Fall nicht, das ist der selbe Fehler wie oben. Du musst wohl oder übel das für jede Zahl einzeln machen. Dafür kannst du aber die lambda-Ausdrücke benutzten, damit du nicht zig Funktionsnamen verwenden musst.

Code: Alles auswählen

but1=Button(root,text="Gebe eine eins aus!",command=lambda :eingabe.insert(END,"1"))
but1.grid()

but2=Button(root,text="Gebe eine zwei aus!",command=lambda :eingabe.insert(END,"2"))
but2.grid()

but3=Button(root,text="Gebe eine drei aus!",command=lambda :eingabe.insert(END,"2"))
but3.grid()
Bugfix
User
Beiträge: 30
Registriert: Mittwoch 9. Juli 2003, 15:58

Mal ganz ungeachtet dessen das eine solche Konstruktion ja nur zum Demon. für das ist.

Wer verwendet einen Button auf dem via Klick immer der selbe Text erscheint ??
Dann fände ich schon ein Klicksystem mit Counter und Abfrage oder ähnlichem sinnvoller wobei immer etwas anderes ausgegeben wird ;)

Oder er bastelt ein Spielchen :roll:
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
Blackfankie hat geschrieben:Gibt es für das auch noch eine Möglichkeit oder muß ich für jedes command immer wider eingabe.insert(END,"*") schreiben ???
Dazu noch eine Variante, die auch zeigt, wie Du variable Werte mit lambda verarbeiten kannst.

Code: Alles auswählen

...
eingabe.grid()

butlist = []  # Liste, die die Button aufnimmt
for text in ("1","2","3"):
    but=Button(root,text="Gebe eine "+text+" aus!",command=lambda t=text:ausgabe(t))
    but.grid()
    butlist.append(but)

# et cetera
root.mainloop() 
Das mit butlist kannst Du Dir schenken, wenn Du einen Zugriff auf die Button selbst gar nicht brauchst.

Jan
Blackfankie
User
Beiträge: 16
Registriert: Sonntag 20. Juli 2003, 00:36

hi,

Danke...

... das letzt ist ambesten... halt was für Tipp faule ;-)

>Wer verwendet einen Button auf dem via Klick immer der selbe Text erscheint ??
Dann fände ich schon ein Klicksystem mit Counter und Abfrage oder ähnlichem sinnvoller wobei immer etwas anderes ausgegeben wird

>Oder er bastelt ein Spielchen

nur ein Taschenrechner :-)

MFG

Blackfankie
Antworten