Werteübergabe an def ... funktioniert nicht

Fragen zu Tkinter.
Antworten
peko
User
Beiträge: 19
Registriert: Montag 5. Juni 2017, 14:41

Hallo,

ich habe ein Problem mit der Werteübergabe an eine Funktion.
Je nach übergebenem Wert soll eine anderes image angezeigt werden.
Ich habe es bereits mit Strings und Zahlenwerten probiert, aber die Fehlermeldung bleibt dieselbe.
Wo liegt mein Denkfehler?

Code: Alles auswählen

def info_image(bild):
    if bild == '1':
        limage.configure(image=infoimage_klingel)
        root.after(1000, info_image)
    elif bild == '2':
        limage.configure(image=infoimage_haken)
        root.after(1000, info_image)
    else:
        limage.configure(image=infoimage_kamera)
        root.after(1000, info_image)
Abholen der Bilder:

Code: Alles auswählen

infoimage_klingel = PhotoImage(file='klingel.gif')
infoimage_haken = PhotoImage(file='haken.gif')
infoimage_kamera = PhotoImage(file='kamera.gif')
Aufgerufen wird hier:

Code: Alles auswählen

# imagefenster
bild = '2'
limage = tk.Label(root)
limage = tk.Label(info_image(bild),bg=mainforeg, fg=mainbackg)
limage.place(x = 0, y = 180, width=60, height=60)
Die Fehlermeldung lautet:
TypeError: info_image() missing 1 required positional argument: 'bild'

Ich übergebe aber doch die '2' an die Funktion ?!
Wenn ich in der Funktion selbst (vor dem if bild == '1')
bild = '2'
eingebe, dann funktioniert es ...
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@peko: was willst Du mit `after` erreichen? Dort wird nämlich kein Parameter übergeben.

Es macht auch keinen Sinn, den Rückgabewert der Funktion `info_image`, None, als Parent des Labels zu setzen? `limage` wird auch gleich mit einem neuen Label überschrieben?

Was willst Du wirklich machen? Kannst Du das mit Worten beschreiben, denn der Code ist leider unverständlich.

Statt vieler if-Abfragen benutzt man in solch einem Fall ein Wörterbuch:

Code: Alles auswählen

images = {
    "1": PhotoImage(file='klingel.gif'),
    "2": PhotoImage(file='haken.gif'),
    "3": PhotoImage(file='kamera.gif'),
}

bild = "2"
limage.configure(image=images[bild])
peko
User
Beiträge: 19
Registriert: Montag 5. Juni 2017, 14:41

@ Sirius3

das mit dem 'after' klappt ja soweit (dein Tip von vor ein paar Tagen)
Ich habe auch nur einen Teil des Codes gepostet.
Die Funktion:
Ein TFT-Türschild mit Klingel und RFID Erkennung. Es soll so sein, dass je nachdem welches Ereignis an meinem Türschild
eintrifft, also Klingeln, RFID Erkennung usw. oder eben nichts, eine entsprechende Meldung mit einem zugehörigen Bild angezeigt wird.
Das Problem war jetzt, dass die Werteübergabe, also die Nummer des Bildes nicht funktioniert hat.
Das ist mir immer noch nicht klar, warum.

Danke schon mal für den Tip mit dem Wörterbuch, werde es heute Abend noch damit versuchen.
Antworten