lambda durch normale Fkt ersetzen

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
Litceo1
User
Beiträge: 2
Registriert: Dienstag 7. März 2017, 11:58

Hallo zusammen,
Tut mir leid wenn die frage vlt. sehr dumm ist aber ich bin noch ganz neu und komme nicht weiter.
Ich habe mithilfe einem jetzt schon etwas älteren Tutorial so das Grundkonzept eines Taschenrechners mit GUI programmiert.
nun wollte ich das immer wiederkehrende (Methode 1)

Code: Alles auswählen

b3.bind("<Button-1>", lambda x: t.insert(END,"3"))
durch (Methode 2)

Code: Alles auswählen

b3.bind("<Button-1>", PushButton("3"))
ersetzten wobei PushButton wie folgt definiert ist:

Code: Alles auswählen

def PushButton(i):
    t.insert(END,i)
Wenn ich nun aber Methode 2 verwende wird die Aktion die eigentlich erst beim drücken des Buttons geschehen soll, am Anfang ausgeführt und der Button macht nichts.

Vielen dank schonmal für eure Hilfe


P.S.: Unten ist jetzt noch der komplette code. Die bindings sind natürlich noch unvollständig.

Code: Alles auswählen

from tkinter import *
from math import *

def calc(event):
    gleichung = t.get
    t.delete
    v['text'] = eval(t.get())

top = Tk()
t = Entry(top)
t.grid(row=0,columnspan=3)

b1 = Button(top,text="1")
b1.grid(row=1,column=0)
b2 = Button(top,text="2")
b2.grid(row=1,column=1)
b3 = Button(top,text="3")
b3.grid(row=1,column=2)
b4 = Button(top,text="4")
b4.grid(row=2,column=0)
b5 = Button(top,text="5")
b5.grid(row=2,column=1)
b6 = Button(top,text="6")
b6.grid(row=2,column=2)
b7 = Button(top,text="7")
b7.grid(row=3,column=0)
b8 = Button(top,text="8")
b8.grid(row=3,column=1)
b9 = Button(top,text="9")
b9.grid(row=3,column=2)
b0 = Button(top,text="0")
b0.grid(row=4,column=1)
bdel = Button (top,text="DEL")
bdel.grid(row=4,column=2)
bad = Button(top,text="+")
bad.grid(row=0,column=3)
bsub = Button(top,text="-")
bsub.grid(row=1,column=3)
bmul = Button(top,text="*")
bmul.grid(row=2,column=3)
bdiv = Button(top,text="/")
bdiv.grid(row=3,column=3)
beq = Button(top,text="=")
beq.grid(row=4,column=3)

def PushButton(i):
    t.insert(END,i)

b1.bind("<Button-1>", PushButton("1"))
b2.bind("<Button-1>", PushButton("2"))
b3.bind("<Button-1>", lambda x: t.insert(END,"3"))




top.mainloop()
BlackJack

@Litceo1: Jedes ``lambda`` ist ja eine *eigene* Funktion. das heisst die direkte Ersetzung von ``lambda x: t.insert(END, '3')`` als normale Funktion ist erst einmal:

Code: Alles auswählen

def insert_three(_event):  # das `x` aus dem ``lambda``-Ausdruck.
    t.insert(END, '3')

# und im `bind()` dann:

….bind('<Button-1>', insert_three)
Und das müsstest Du für jedes ``lambda`` machen. Wenn Du nur *eine* Funktion haben möchtest und die so Aufrufen möchtest wie Du das tust, dann muss diese Funktion eine Funktion zurückgeben die ein Event-Objekt erwartet (das `x` in Deiner ``lambda``-Funktion) und dann die entsprechende Zahl in das Eingabefeld einfügt:

Code: Alles auswählen

def create_insert(value):
    def insert(_event):
        t.insert(END, value)
    return insert

# und im `bind()` dann:

….bind('<Button-1>', create_insert('3'))
Das Stichwort heisst „Closure“.

Oder man schreibt sich eine Funktion die den Wert und das Event-Objekt erwartet und bindet den Wert dann mit `functools.partial()`:

Code: Alles auswählen

def insert(value, _event):
    t.insert(END, value)

# und im `bind()` dann:

….bind('<Button-1>', partial(insert, '3'))
Ich persönlich würde `partial()` oder ``lambda`` verwenden. Closures waren die Möglichkeit als es `partial()` noch nicht in der Standardbibliothek gab.

Konkret in dem Beispiel würde ich übrigens die Finger von `bind()` lassen, denn damit umgehst Du das typische Verhalten von Schaltflächen, die der Anwender erwartet wenn er solche sieht. Die Aktion für `Button`\s gibt man über die `command`-Aktion des `Button` an, und nicht als `bind()` für den Mausklick.

Ferner solltest Du Sternchenimporte sein lassen und einbuchstabige, nichtssagende Namen. Dann auch noch durchnummerierte einbuchstabige Namen. Und keine kryptischen Abkürzungen.
Litceo1
User
Beiträge: 2
Registriert: Dienstag 7. März 2017, 11:58

Okay danke für deine Tips.
Damit ist das Thema dann wohl fertig.
Antworten