if but1 is True: ???

Fragen zu Tkinter.
Antworten
py-mule
User
Beiträge: 58
Registriert: Samstag 3. Januar 2009, 10:42

Freitag 30. Januar 2009, 11:00

Hallo,
ich möchte je nachdem welcher Button gedrückt ist eine Verzweigung anbringen. Ich habe es folgendermaßen versucht (geht aber nicht):

Code: Alles auswählen


but1=Button(text='but1', command = funktion_aufrufen)

if but1 is True:
    mach etwas
elif but2 is True:
    mach etwas anderes
elif but3
    noch was anderes
else:
    keine Ahnung
Wie bekomme ich eine solche Verzweigung hin?

Vielen Dank und viele Grüße
py-mule
Benutzeravatar
wuf
User
Beiträge: 1483
Registriert: Sonntag 8. Juni 2003, 09:50

Freitag 30. Januar 2009, 11:57

Hallo py_mule

Dein Code kann so leider nicht funktionieren da er zu viele Fehler enthält. Sieht aus wie Pseudocode.

Hier ein Beispiel aus vielen Möglichkeiten:

Code: Alles auswählen

import Tkinter as tk

def funktion_aufrufen(button_name):
    """Schaltflaeche wurde aktiviert"""

    if button_name == 'but1':
        print "mach etwas"
    elif button_name == 'but2':
        print "mach etwas anderes"
    elif button_name == 'but3':
        print "noch was anderes"
    else:
        print "keine Ahnung "

app_window = tk.Tk()

button_name = 'but1'
but = tk.Button(app_window, text=button_name,
    command=lambda name=button_name: funktion_aufrufen(name))
but.pack()

button_name = 'but2'
but = tk.Button(app_window, text=button_name,
    command=lambda name=button_name: funktion_aufrufen(name))
but.pack()

button_name = 'but3'
but = tk.Button(app_window, text=button_name,
    command=lambda name=button_name: funktion_aufrufen(name))
but.pack()

button_name = 'no idea'
but = tk.Button(app_window, text=button_name,
    command=lambda name=button_name: funktion_aufrufen(name))
but.pack()

app_window.mainloop()
Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Freitag 30. Januar 2009, 12:42

py-mule hat geschrieben:Wie bekomme ich eine solche Verzweigung hin?
Ui, das sieht aber gar nicht gut aus.

Ich denke, du solltest mal mit den Basics anfangen. Hier z.B.: http://www.wspiegel.de/tkinter/tk_probe01.htm
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Freitag 30. Januar 2009, 14:00

is prüft auf Objektidentität, nicht auf Gleichheit, wofür == geschaffen ist.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Freitag 30. Januar 2009, 15:09

Um auf True zu testen, braucht man weder is noch ==. :wink:
MfG
HWK
BlackJack

Freitag 30. Januar 2009, 19:36

Man sollte auch besser gleich die richtigen Funktionen an die `Button`\s binden statt in einer ``if``/``elif``-Kaskade zu entscheiden was gemacht wird.
bords0
User
Beiträge: 172
Registriert: Mittwoch 4. Juli 2007, 20:40

Sonntag 8. Februar 2009, 21:13

HWK hat geschrieben:Um auf True zu testen, braucht man weder is noch ==.
Der Vollständigkeit halber sei erwähnt, dass streng genommen

Code: Alles auswählen

if a:
und

Code: Alles auswählen

if a == True:
nicht unbedingt das gleiche Ergebnis liefern. Man denke zum Beispiel an

Code: Alles auswählen

a = [1]
(...oder war was anderes gemeint?)
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Sonntag 8. Februar 2009, 21:30

Mit if x: überprüft man den Wahrheitswert eines beliebigen Objektes. Wenn das bereits ein Wahrheitswert ist, wird er so genommen wie er ist. if x == True: Testet, ob ein Wert gleich dem Wahrheitswert True ist, wobei wieder ein True herauskommt. Es ist also redundant, auf diese Art und Weise zu testen, da if im Grunde automatisch auf Wahrheitswerte testet, und der Rest bloß ein Ausdruck ist, den Python auswertet, und dann True oder False zurückliefert. Das ein Test auf Gleichheit mit True nicht das gleiche ist wie ein Test auf den Wahrheitsheit eines Objektes, ist ja klar.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Sonntag 8. Februar 2009, 21:43

Vielleicht noch als Ergänzung: "if [1]" entspricht einem "if bool([1])". "bool" versucht dann auf [1] die Methode "__nonzero__" (bzw. "__bool__" ab 3.0) aufzurufen. Falls diese nicht existiert "__len__". Wenn beide kein Ergebnis liefern wird "True" zurückgegeben.

Edit: In etwa so:

Code: Alles auswählen

def bool(x):
    try:
        return x.__nonzero__()
    except AttributeError:
        try:
             return x.__len__()
        except AttributeError:
            return True
Das Leben ist wie ein Tennisball.
Antworten