warum funktioniert if/else logik nicht

Fragen zu Tkinter.
Antworten
reverse
User
Beiträge: 62
Registriert: Mittwoch 29. November 2006, 22:43

hello alle
brauche einbisschen logik hilfe!!

Code: Alles auswählen

from Tkinter import *

def callback():
//========= warum funktioniert if/else logik nicht ===========
    if label == "New":
        print "Das is ja wunderbar!"
    else:
        print "Das is ja nicht so toll!"
//==========================
root = Tk()

# create a menu
menu = Menu(root)
root.config(menu=menu)

filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New", command=callback)
filemenu.add_command(label="Open...", command=callback)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=callback)

mainloop()

ps. wo kann ich ein beispiel vom tk bitmap combobox herunterladen?

mfg
reverse
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Du solltest der Funktion den Label als Argument übergeben, z.B. in der Form:

Code: Alles auswählen

filemenu.add_command(label="New", command=lambda arg='New': callback(arg))
MfG
HWK
reverse
User
Beiträge: 62
Registriert: Mittwoch 29. November 2006, 22:43

hello HWK
danke fur die feedback, leider erhalte ich immer noch fehler!!
filemenu.add_command(label="Value 1", command=lambda arg='Value 1': callback(arg))
TypeError: callback() takes no arguments (1 given)

Code: Alles auswählen

from Tkinter import *

def callback():
    if label == "Value 1":
        print "Value 1"
    elif label == "Value 2":
        print "Value 2"
    elif label == "Value 3":
        print "Value 3"
    else:
        print "Done"

root = Tk()

# create a menu
menu = Menu(root)
root.config(menu=menu)

filemenu = Menu(menu)
menu.add_cascade(label="Select Items", menu=filemenu)
filemenu.add_command(label="Value 1", command=lambda arg='Value 1': callback(arg))
filemenu.add_command(label="Value 2", command=lambda arg='Value 2': callback(arg))
filemenu.add_command(label="Value 3", command=lambda arg='Value 3': callback(arg))

mainloop()
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Hallo,
und ich dachte du kannst Englisch :roll:

Code: Alles auswählen

def callback(label):
Gruss
pyStyler
reverse
User
Beiträge: 62
Registriert: Mittwoch 29. November 2006, 22:43

hör mal pyStyler
Ich kann englisch :evil:

wie meinst du mit def callback(label):?

muss ich label einfugen
filemenu.add_command(label="Value 1", command=lambda arg='Value 1': callback(arg))

oder
def callback(): ---und label hier
if label == "Value 1":

????



warum ist das eigentlich so kompiziert in python????


add nums of items to menu and if it meets the conditon then throw message to an ouput...

menu 1 = val1
menu 3 = val2
menu 3 = val3

onMouseEvent(){
if menu 1== "Value 1":
print "Value 1"
elif menu 2== "Value 2":
print "Value 2"
elif menu 3== "Value 3":
print "Value 3"
else:
print "Done"
}
Zuletzt geändert von reverse am Donnerstag 8. Februar 2007, 19:58, insgesamt 1-mal geändert.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Also doch kein Englisch :)
filemenu.add_command(label="Value 1", command=lambda arg='Value 1': callback(arg))
TypeError: callback() takes no arguments (1 given)
Sagt du rufst callback mit einem Argument auf:

Code: Alles auswählen

filemenu.add_command(label="Value 1", command=lambda arg='Value 1': callback(arg))
Dieses Argument ist arg (also eine Variable).

Du definierst mit def callback() eine Funktion die keine Variablen erwartet, somit übergibst du ein Argument an eine Funktion, die wie der TypeError schon sagt, keine Argumente annimmt!
Richtig ist, wie du selbst fast erkannt hast:

Code: Alles auswählen

def callback(label):
MfG apollo13[/code]
reverse
User
Beiträge: 62
Registriert: Mittwoch 29. November 2006, 22:43

natürlich weiss ich dass arg für argument steht

was für mich am eher logisch erscheint

Code: Alles auswählen

from Tkinter import *

def callback():
    if arg1 == "Value 1":
        print "Value 1"
    elif arg2 == "Value 2":
        print "Value 2"
    elif arg3 == "Value 3":
        print "Value 3"
    else:
        print "Done"

root = Tk()

# create a menu
menu = Menu(root)
root.config(menu=menu)

filemenu = Menu(menu)
menu.add_cascade(label="Select Items", menu=filemenu)
filemenu.add_command(label="Value 1", command=lambda arg='Value 1': callback(arg1))
filemenu.add_command(label="Value 2", command=lambda arg='Value 2': callback(arg2))
filemenu.add_command(label="Value 3", command=lambda arg='Value 3': callback(arg3))

mainloop()

aber leider funktioniert es nicht :(
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Ohne unhöflich sein zu wolllen:
Liest du eigentlich was die anderen Leute schreiben, oder hörst du nach der ersten Zeile auf?
Und warum arg1, arg2, arg3 nicht gehen wird ist klar, wo sollen die herkommen^^

MgnfG apollo13
reverse
User
Beiträge: 62
Registriert: Mittwoch 29. November 2006, 22:43

was ich nicht ganz kopiere sind die callback methode

def callback(Item1, Item2, Item3):
if label == "Item1":
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

reverse hat geschrieben:hör mal pyStyler
Ich kann englisch :evil:
ist ja gut schrei nicht so !

Code: Alles auswählen

from Tkinter import *
#import sys

def callback1():
	print "Value 1"
def callback2():
	print "Value 2"
def callback3():
	print "Value 3"
	#sys.exit() 

root = Tk()

# create a menu
menu = Menu(root)
root.config(menu=menu)

filemenu = Menu(menu)
menu.add_cascade(label="Select Items", menu=filemenu)
filemenu.add_command(label="Value 1", command=callback1)
filemenu.add_command(label="Value 2", command=callback2)
filemenu.add_command(label="Value 3", command=callback3)

mainloop() 
kannst Du jetzt damit was anfangen!
Und weil du so Nett :evil: bist, hier noch ein Link für dich.
http://effbot.org/tkinterbook/menu.htm
Zuletzt geändert von pyStyler am Donnerstag 8. Februar 2007, 20:29, insgesamt 1-mal geändert.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Okay:

Code: Alles auswählen

def callback(label):
if label == "Value 1": pass
elif label == "Value 2": pass
....

filemenu.add_command(label="Value 1", command=lambda arg='Value 1': callback(arg))
filemenu.add_command(label="Value 2", command=lambda arg='Value 2': callback(arg))
filemenu.add_command(label="Value 3", command=lambda arg='Value 3': callback(arg))
Schau dir das genau durch und frag dann was exakt du hier nicht verstehst!

MfG apollo13

P.S.: Bitte bemühe dich möglichst nach der deutschen Rechtschreibung zu schreiben, dies verbessert die Les- und Verständlichbarkeit deiner Beiträge enorm :)[/code]
BlackJack

Wobei das kein besonders schöner Code ist, wenn man sich anschaut wie oft die jeweiligen Werte wiederholt eingegeben werden müssen. Wenn man da etwas ändern will, dann muss man das an verschiedenen Stellen im Programm tun. Das kann fehleranfällig werden.
reverse
User
Beiträge: 62
Registriert: Mittwoch 29. November 2006, 22:43

immer noch error meldung

Code: Alles auswählen

def callback(label):
    if label == "Value 1": pass
        print "label"
    elif label == "Value 2": pass
        print "label2"
    elif label == "Value 2": pass
        print "label3"
    else:
        print "done"
print "label"
^
SyntaxError: invalid syntax
print "label" ......syntax error warum???
BlackJack

Weil alles nach einem ``:`` gleich tief eingerückt sein muss. Schau mal genau was da steht und versuch Dir jede einzelne Anweisung zu erklären.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Du musst das "pass" weglöschen!
Pass heißt einfach so viel wie: "tu nichts und mach weiter" und ich war zu faul um print "label" etc... zu schreiben...

MfG apollo13
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

reverse hat geschrieben:immer noch error meldung

Code: Alles auswählen

def callback(label):
    if label == "Value 1": pass
        print "label"
    elif label == "Value 2": pass
        print "label2"
    elif label == "Value 2": pass
        print "label3"
    else:
        print "done"
weil du nach nichts mehr in der gleiche Einrückung schreiben darfst. Also sind deine print 'label'... für die Katz!
Mein Vorschlag - mach es wie ich es weiter oben gezeigt habe.

edit: war jemand wohl schon wieder schneller :)
Antworten