def a(zahl)...

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
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Montag 16. April 2007, 16:47

hi,
ich habe ein kleines problem.

Das ist der dazugehörige Code:

Code: Alles auswählen

from Tkinter import*

i=0

def a(zahl):
        global i
        i+=1
        print i

hf=Tk()
frame=Frame(hf,width=300,height=300)
frame.pack()

button=Button(frame,text='+1',command=a(1))
button.place(x=10,y=10)

button2=Button(frame,text='+2',command=a(2))
button2.place(x=30,y=30)
-> Ich habe gerade bemerkt, dass "command=python()" und command=python ein Unterschied ist und das erste das komando gleich ausführt und das zweite nur passiert, wenn man auf den Button drückt.

Weiß jemand, wie man das hinkriegt, das man trotzdem die Methode wie im Beispiel verwendet (spart code) aber die definition erst aufgerufen wird, wenn man auf den Button drückt?

Danke :)
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Montag 16. April 2007, 16:50

Ich weiß, dass es nicht die wunderbare Sache ist, es ohne eine klasse zu machen aber das sollte auch nur ein Versuch für ein richtiges Programm sein,
bei dem es eben dauernd gleich die definitionen ausgeführt hat und ich jetzt wissen wollte, woran das lag^^
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Montag 16. April 2007, 18:35

Ich machs mal kurz:

Code: Alles auswählen

button=Button(frame,text='+1',command=a(1)) 
wird zu:

Code: Alles auswählen

button=Button(frame,text='+1',command=lambda : a(1)) 
oder auch:

Code: Alles auswählen

import functools
button=Button(frame,text='+1',command=functools.partial(a,1))
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Montag 16. April 2007, 19:01

cool danke EyDu :D
lambda hab ich schonmal gehört, dachte es man könnte damit kleine Funktionen bauen? Was macht es hier genau? Könntest du mir das bitte erklären? :D
Und was macht das Modul functools?

Vielen Dank! :D
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 16. April 2007, 19:06

Markus12 hat geschrieben:lambda hab ich schonmal gehört, dachte es man könnte damit kleine Funktionen bauen?
Das ist ja auch eine kleine Funktion. Es ist eine anonyme Funktion die keinen Namen hat, aber aufgerufen wird, wenn man auf den Button klickt.
Markus12 hat geschrieben:Und was macht das Modul functools?
Stellt ein paar Funktionen bereit, siehe Doku. Dieser Ansatz macht mehr oder weniger das gleiche wie der Ansatz mit lambda.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Dienstag 17. April 2007, 18:34

Hi,
die functools methode ist für meine Verwendung besser! Lambda hat in meinem Speziellem Fall nicht funktioniert, aber functools schon:

Code: Alles auswählen

def button(zahl):
        global string
        string+=str(zahl)


buttonlist=[(0,60,230),(1,20,190),(2,60,190),(3,100,190),(4,20,150),(5,60,150),(6,100,150),(7,20,110),(8,60,110),(9,100,110)]

for zahl,k_x,k_y in buttonlist:
        print zahl
        BUTTONS=Button(frame,bg='DarkGreen',text=str(zahl),font=('Arial',10,'bold'),relief='ridge',width=2,command=functools.partial(button,zahl))
        BUTTONS.place(x=k_x,y=k_y)
Das ^ soll button erzeugen, deren Informationen, die sich ändern, aus der Liste stammen. Mit "Lambda" hat das ganze nicht funktioniert, da bei jedem Mal, bei dem ich auf eine der zahlenbutton drückt, eine 9 hinzugefügt wird (der letzte der erzeugten button).
Antworten