Seite 1 von 1

prob mit Entry

Verfasst: Dienstag 22. Juli 2003, 22:25
von Blackfankie
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

Verfasst: Dienstag 22. Juli 2003, 23:47
von 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

Verfasst: Mittwoch 23. Juli 2003, 00:34
von Blackfankie
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

Verfasst: Mittwoch 23. Juli 2003, 08:10
von Bugfix
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()

Verfasst: Mittwoch 23. Juli 2003, 08:17
von lbuega
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!

Verfasst: Mittwoch 23. Juli 2003, 08:18
von Milan
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???"))

Verfasst: Mittwoch 23. Juli 2003, 08:21
von Bugfix
Danke Milan, das mit dem Lamba (ist eh irgendwie Konfus dieser Begriff) habe ich noch nicht gewusst :)

Verfasst: Mittwoch 23. Juli 2003, 08:26
von Milan
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

Verfasst: Mittwoch 23. Juli 2003, 14:40
von Blackfankie
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

Verfasst: Mittwoch 23. Juli 2003, 14:46
von Milan
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()

Verfasst: Mittwoch 23. Juli 2003, 14:57
von Bugfix
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:

Verfasst: Mittwoch 23. Juli 2003, 15:05
von Voges
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

Verfasst: Mittwoch 23. Juli 2003, 16:59
von Blackfankie
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