Variablen übergeben bei Labels

Fragen zu Tkinter.
Antworten
mirfaelltnixein
User
Beiträge: 4
Registriert: Freitag 29. April 2011, 00:23

Hallo alle zusammen.
Ich bin relativ neu bei Python.
Ich arbeite grade an einem kleinen Projekt und da lief mir folgendes Problem über den Weg:
Ich möchte wenn ich auf ein Label klicke, dass ein Funktion ausgeführt wird.
soweit so gut:

Code: Alles auswählen

f1=Label(c,font=(('calibri'),40,'bold'),text=' o ',fg='red')
f1.place(relx=0.05,rely=0.39,anchor=N)
f1.bind( '<Button-1>' ,x)
jetzt möchte aber Variablen übergeben. Ich weiß, dass man dies bei Buttons mit der lambda Funktion macht.
Ich wollte das auch bei meinem Label ausprobieren aber da dort command nicht funktioniert(Fehlermeldung-ich habs ausprobiert) weiß ich nicht wie ich das machen soll.
Ich wäre sehr dankbar wenn mir jemand helfen könnte.
Liebe Grüße
BlackJack

@mirfaelltnixein: Da wo Du `x` stehen hast, muss eine Funktion stehen, die dann aufgerufen wird. Wo genau ist das Problem?
mirfaelltnixein
User
Beiträge: 4
Registriert: Freitag 29. April 2011, 00:23

Vereinfacht sieht das so aus :

Code: Alles auswählen

from Tkinter import *
y=0
def x(event,y):
    print y
root = Tk ( )
c=Canvas(root,width=500,height=500)
c.pack()
f1=Label(c,font=(('calibri'),40,'bold'),text=' o ',fg='red')
f1.place(relx=0.05,rely=0.39,anchor=N)
f1.bind( '<Button-1>',x(3))

mainloop ( )
Das funktioniert allerdings nicht weil ich jetzt ja nur ein Argument geben aber 2 verlangt sind. Aber ich brauche ja das event.
Wie mache ich das dann mit der Variablenübergabe?
vielen Dank für Hilfe
Libe Grüße
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Das ist doch genau das gleiche wie bei "command", du musst eine Funktion übergeben und nicht den Rückgabewert dieser.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
BlackJack

@mirfaelltnixein: Das da macht sowie nicht das was Du willst. Du rufst `x()` ja auf und das *Ergebnis* davon würde an `bind()` übergeben werden, wenn das mit der Parameteranzahl nicht wäre. Du musst da eine Funktion angeben die ein Argument erwartet. Und *die* Funktion könnte dann `x()` aufrufen. Wenn Du dafür keine benannte Funktion mit ``def`` erstellen willst, kannst Du auch eine ``lambda``-Funktion schreiben.
problembär

Ganz gruselig, was Du da machst: Kannst Du nicht lieber einen Button nehmen? Und mach' anstatt des Sternchenimports lieber

Code: Alles auswählen

import Tkinter as tk
Ansonsten: Statt

Code: Alles auswählen

f1.bind( '<Button-1>',x(3))
müßte es dann

Code: Alles auswählen

f1.bind( '<Button-1>', lambda e: x(e, 3))
heißen.

Gruß
mirfaelltnixein
User
Beiträge: 4
Registriert: Freitag 29. April 2011, 00:23

Vielen Dank.
Die Lösung von Problembär war die, die blackjack vorgeschlagen hatte, richtig?
Jetzt klappt es . Ich wusste einfach nicht wie ich das jetzt genau mit der lambda Funktion mache.
Dankeschön :)

import Tkinter as tk
funktioniert bei mir nicht
was muss ich da noch beachten?
es wir folgendes gesagt(Fehlermeldung):

Code: Alles auswählen

Traceback (most recent call last):
  File "/Users/justus/Documents/Python/Mensch ärgere dich nicht/button/test2.py", line 5, in <module>
    root = tk ( )
TypeError: 'module' object is not callable
Aber trotzdem schonmal Danke für die Hilfe :)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

mirfaelltnixein hat geschrieben:import Tkinter as tk
funktioniert bei mir nicht
was muss ich da noch beachten?
es wir folgendes gesagt(Fehlermeldung):

Code: Alles auswählen

Traceback (most recent call last):
  File "/Users/justus/Documents/Python/Mensch ärgere dich nicht/button/test2.py", line 5, in <module>
    root = tk ( )
TypeError: 'module' object is not callable

Code: Alles auswählen

root = tk.Tk()
Das Leben ist wie ein Tennisball.
mirfaelltnixein
User
Beiträge: 4
Registriert: Freitag 29. April 2011, 00:23

Dankeschön,
aber wieso geht dann canvas nicht mehr?
was muss ich da beachten?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

c = tk.Canvas(root,width=500,height=500)
;-)
Das Leben ist wie ein Tennisball.
problembär

Der Grund, warum man den Sternchenimport lieber vemeiden sollte, ist, daß man sonst Funktionen und Objekte im Code stehen hat, von denen man nicht mehr weiß, wo sie herkamen:

Code: Alles auswählen

from Tkinter import *
c = Canvas(...)
Keine Ahnung, wo das "Canvas" nochmal herkam ...

Code: Alles auswählen

import Tkinter as tk
c = tk.Canvas(...)
Ach so, das kam aus dem tk (= Tkinter)-Modul.

Logisch, oder?
Antworten