Tkinter update Label image bei mouse enter

Fragen zu Tkinter.
Antworten
DrW3sk3r
User
Beiträge: 18
Registriert: Dienstag 16. April 2013, 19:39

Hallihallo ich hab ein kleines Problem mit meinen Python Script bzw. Ich möchte mein Bild ändern wenn ich mit dem cursor über das bild fahre ähnlich wie bein einer Webseite.

nur es funktioniert leider nicht wie erwartet und ich weis auch nicht woran es liegen könnte.
Trotzdem tippe ich auf die Funktionen das dort ein Fehler drin ist.

Ich brauche da bei hilfe vielen Dank in Vorraus.

Code:

Code: Alles auswählen

#!/usr/bin/env python
from Tkinter import *
root = Tk()
def enter(event): #Problem bild verschwindet
     path2 = "image2.gif"
     bilddatei2 = PhotoImage(file=path2,width=100,height=100)
     bild["image"] = path2
def leave(event):  #Problem bild kommt nicht zurück
     path = "image1.gif"
     bilddatei = PhotoImage(file=path,width=100,height=100)
     bild["image"] = path
path = "image1.gif"

bilddatei = PhotoImage(file=path,width=100,height=100)

#Das funktioniert und zeigt Bild 1 an
bild = Label(image=bilddatei)
bild.pack()
root.mainloop()

BlackJack

@DrW3sk3r: Das Bild verschwindet weil die Daten nach Ablauf der Funktion wieder freigegeben werden weil Python nichts davon weiss was auf der Tk-Seite noch benötigt wird. Deshalb muss man selber dafür sorgen, dass das `PhotoImage`-Objekt nicht zerstört werden kann. Man könnte es zum Beispiel als Attribut an das `Label`-Objekt binden.
DrW3sk3r
User
Beiträge: 18
Registriert: Dienstag 16. April 2013, 19:39

meinst du quasi das ?

Code: Alles auswählen

....
def enter(event,bild): 
     path2 = "image2.gif"
     bilddatei2 = PhotoImage(file=path2,width=100,height=100)
     bild["image"] = path2
....
DrW3sk3r
User
Beiträge: 18
Registriert: Dienstag 16. April 2013, 19:39

weil das verstehe ich grad daraus kann sein das ich mich irre
BlackJack

@DrW3sk3r: Funktioniert das denn? Dann meine ich das offensichtlich wohl nicht. ;-) Das *`PhotoImage`*-Objekt zusätzlich als *Attribut* an das `Label` binden. Nicht statt des `PhotoImage` eine Zeichenkette als `image`-Option setzen.

Was soll die `2` an den lokalen Namen in der `enter()`-Funktion bedeuten? Die gehört da nicht hin.

Edit: Im ersten Beispiel verschwindet auch kein Bild weil keine der beiden Funktionen jemals aufgerufen wird.

Edit2:

Code: Alles auswählen

#!/usr/bin/env python
import Tkinter as tk


class ImageLabel(tk.Label):
    def __init__(self, master, image, hover_image, **kwargs):
        tk.Label.__init__(self, master, **kwargs)
        self['image'] = self.image = image
        self.hover_image = hover_image
        self.bind('<Enter>', lambda _: self.config(image=self.hover_image))
        self.bind('<Leave>', lambda _: self.config(image=self.image))


def main():
    root = tk.Tk()
    image_label = ImageLabel(
        root, tk.PhotoImage(file='test.gif'), tk.PhotoImage(file='test2.gif')
    )
    image_label.pack()
    root.mainloop()


if __name__ == '__main__':
    main()
DrW3sk3r
User
Beiträge: 18
Registriert: Dienstag 16. April 2013, 19:39

jetzt verstehe ich das du meinst das so sry mein fehler hatte vergessen zu aktualisieren deshalb der blöde kommentar von eben
DrW3sk3r
User
Beiträge: 18
Registriert: Dienstag 16. April 2013, 19:39

ich hatte vorhin sowas im kopf gehabt aber habe schnell gemerkt das dies ne dumme idee war

Code: Alles auswählen

....
def enter(event):
     w = event.widget
     w["image"] = PhotoImage(......)
.....
bild = Label(image=PhotoImage(.....))
.....
DrW3sk3r
User
Beiträge: 18
Registriert: Dienstag 16. April 2013, 19:39

:wink: Ich entschuldige mich für meine dummheit.

Denn das konnte ich net wissen da ich sehr selten mich mit programmieren beschäftige bin eher der zocker
DrW3sk3r
User
Beiträge: 18
Registriert: Dienstag 16. April 2013, 19:39

was ich aber machen werde , ich werde mir dazu Bücher kaufen damit ich einen besseren durchblick habe ich bedanke mich bei euch für die hilfe :) :)
Antworten