Tooltipanzeige per Mouseover

Fragen zu Tkinter.
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

Dienstag 28. April 2009, 08:06

Hallo an alle,

ich wollte mal wissen, ob es möglich ist, sich Text anzeigen zu lassen, wenn man mit der Maus über ein bestimmtes Objekt in einem Fenster fährt.
Also quasi, wenn man mit der Maus über einem Button/Textfeld etc. drüber fährt (ohne klicken) dass dann so eine Art Tooltip erscheint, mit einem Hinweis, was man machen soll.

Beispielsweise hat der Benutzer die Maus über ein Entry-Feld und dort soll dann neben dem Mauszeiger z.B. erscheinen was er eintragen soll.

Geht sowas überhaupt?

Danke schonmal für eure Hilfe

Daniela
Redprince
User
Beiträge: 128
Registriert: Freitag 22. Oktober 2004, 09:22
Wohnort: Salzgitter
Kontaktdaten:

Dienstag 28. April 2009, 08:28

Ein Blick ins Manual hat gezeigt, dass es wahrscheinlich nicht geht, hätte mich auch gewundert. Ein noch halbwegs annehmbarer Workaround könnte aber ein Label darstellen, welches für sämtliche vorhandene Eingabefelder etc. Tooltipps anzeigt, sobald die entsprechenden Widgets den Focus erhalten..
I am not part of the allesburner. I am the [url=http://allesburner.de]allesburner[/url].
Benutzeravatar
wuf
User
Beiträge: 1419
Registriert: Sonntag 8. Juni 2003, 09:50

Dienstag 28. April 2009, 10:40

Hallo Daniela

Hier eine mögliche Variante:

Code: Alles auswählen

# Skriptname: tk_tool_tip_01.py

import Tkinter as tk

class MyToolTip(tk.Toplevel):

    TIP_X_OFFSET = 8
    TIP_Y_OFFSET = 8
    AUTO_CLEAR_TIME = 1000 # Millisek. (1 sek.)

    TIP_SYMBOL = """
    R0lGODlhIAAgAOMMAAgICABSAABjMXtjOf9jAGOcYwDOY/+cMf/GQs7OnP//
    Y///pf///////////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAA8A
    LAAAAAAgACAAAAT+8MlJq704630PQpaHeBxFPqO5TGl5rMjyHRItLzLNvfI3
    k73fDIQBBT8EoC9JfMiKsZgoqfB4CEacQtGaiA5fMBV8wDp9Pl1thRqRCcn3
    gQt2z1iPLVoMH5ThCHFkfDV5aXBwZQMJAwCIj3wDeDOJiJKMjYKPBAOSk3A4
    SUmLnY6JYp2eFWUxC6KoAKaIb6oVHzhXfHOQcX1FZyMjiQqzp4oFyAW2wG5w
    Cgtl0VacAtUCBsgUBM/NSYaBP9TIBgbWARMDm51zzyu44tUF1+UB5xKpnQ/p
    HlxInPUBBMgrV82APQzp1A0weC5gQYIHEeLzRK7eA4fVLJa4UFECwIgbGy1g
    AxlSg8GSG0eiLHFy5QaVLjVojEmzZoUIADs=
    """

    def __init__(self, xpos, ypos, message="my tooltip", auto_clear=False):

        self.xpos = xpos
        self.ypos = ypos
        self.message = message
        self.auto_clear = auto_clear

        tk.Toplevel.__init__(self)
        self.overrideredirect(True)

        self.tip_symbol = tk.PhotoImage(data=self.TIP_SYMBOL)
        self.message_label = tk.Label(self, compound='left', text=self.message,
            image=self.tip_symbol, bg='palegoldenrod', fg='blue')
        self.message_label.pack()

        self.geometry("+%d+%d" % (self.xpos+self.TIP_X_OFFSET,
            self.ypos+self.TIP_X_OFFSET))

        if self.auto_clear:
            self.after(self.AUTO_CLEAR_TIME, self.clear_tip)

    def clear_tip(self):
        """Entferne den Tool-Tip"""

        self.destroy()

def entry_mouse_enter(event):
    """Die Maus bewegt sich ins Entry-Widget"""

    print 'Enter', event.x_root, event.y_root

    app_win.my_tool_tip = MyToolTip(event.x_root, event.y_root,
        "Hallo Daniela!!!")

def entry_mouse_leave(event):
    """Die Maus bewegt sich aus dem Entry-Widget"""

    #~~ Entferne den Tool-Tip
    app_win.my_tool_tip.destroy()

app_win = tk.Tk()
app_win.title("Tool-Tip")
app_win.geometry("%dx%d+%d+%d" % (200,50,20,20))

my_entry = tk.Entry(app_win, highlightthickness=0, width=20, bg='white',
    cursor='pencil')
my_entry.place(x=10, y=10)
my_entry.bind('<Enter>', entry_mouse_enter)
my_entry.bind('<Leave>', entry_mouse_leave)

app_win.mainloop()
Gruss wuf :wink:
Take it easy Mates!
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

Dienstag 28. April 2009, 11:00

Das ist ja cool.

Dankeschön!!!


Ich werds mal in meinen Code einarbeiten und mal sehen, wie es dann funktioniert.

LG
Daniela
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Dienstag 28. April 2009, 14:15

Redprince hat geschrieben:Ein Blick ins Manual hat gezeigt, dass es wahrscheinlich nicht geht, hätte mich auch gewundert.
Die Verwunderung verstehe ich nicht. Natürlich geht das, und zwar mit Hilfe eines rahmenlosen Toplevel-Widgets. Passenden Code hat wuf ja gleich geliefert ... :wink:
Redprince
User
Beiträge: 128
Registriert: Freitag 22. Oktober 2004, 09:22
Wohnort: Salzgitter
Kontaktdaten:

Dienstag 28. April 2009, 14:39

Ich hatte nicht dran gedacht, dass man den Rahmen bei Widgets entsorgen kann. Hatte natürlich an ein Toplevel-Widget gedacht, aber es für eine schlechte Idee gehalten wegen des Rahmes. Deshalb der Workaround ;)
I am not part of the allesburner. I am the [url=http://allesburner.de]allesburner[/url].
Benutzeravatar
krisi12345
User
Beiträge: 205
Registriert: Mittwoch 4. März 2009, 16:56
Wohnort: Das schöne München
Kontaktdaten:

Sonntag 24. Mai 2009, 09:48

Kleine Frage:
Im oben beschriebenen Beispiel ist ein Bild aus Buchstaben.
Ich hab so was schon öfters gesehen aber Ich weis nicht wie man so was erzeugt.
Gibs da vieleicht ne Seite oder ein Programm wo man so was machen kann?
BlackJack

Sonntag 24. Mai 2009, 10:59

@krisi12345: Das sind einfach die Binärdaten aus einer GIF-Datei als Base64 kodiert. Da braucht man nicht unbedingt ein extra Programm, dass kann auch einfach in der Python-Shell mal schnell umwandeln. Beispiel:

Code: Alles auswählen

In [379]: f = open('Hopsy.gif', 'rb')

In [380]: print f.read().encode('base64')
R0lGODlhJAAkAPYAAAAAAAM9DARMDwRQDwRSEAVkEwZtEwZyFQd7FgeBFweFGAqFGQqNGgiVGwqa
HBGEHRGKHhCUHg+cIBmNIxWQIRGdIBuTJRqZJQmjHQmqHgqwHw2tIQq0IAq5IRSiIxmmJh2mKRuo
Jx2rKSKTKSaYKyicLiKiKyKuLCmiLyqtMSSxLiC9Lia1MCm0MSu5MzKrNTesODOyNjG+Nzu1Ozy/
PQvEIgvNIwzUJQzbJhbHKRHVKBPZKg3hJw3lKA3rKBLjKhjkLiTXMzDDNzXCOTjFPDvIPiXlNSPp
NSvtOj3LQD3WQUHPQ03JSEXSRUrUSE3aSlTTTlHdTVPgT1XiUFXoUVzlVFzqVVL/VGDoV2HuWGjs
XGXyW2H/XGj2XW38YnP+ZXv/a4D/boX/cor/dY7/eZL/fp3/gqz/jbP/k7r/l7//ms3/pdb/q97/
sszMzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
BAEAAG4AIf4VQ3JlYXRlZCB3aXRoIFRoZSBHSU1QACwAAAAAJAAkAAAH/oBugoOEgjc3NomKijWF
jo+ENz49kzg4h4c2NRwYHJCfbjo+oz4/V15PQywiHg4ZGhwdGBmghaQ/ZWliXlNNQy4nHx4VFQ6u
Gg61bkejPGVsZ2ZiX1ZPRTInIK3GDQ0OGN6fpEBta2nRY19RNC4p2R7bDt3eGAmQlEhramloZ2FQ
M0pMmGDBwgQIECgYkzdPwaNJRs5IjKYFxogRJEqkSAHiwoIFDBh4m9etgC0fO8qoPDOGSQkSM6po
kbJEFasQESCIJNnNAKEeOK58ASOmS8AXWMJ86SLF16oQHiJEaLCTpD1BPW4EoWKlC5YXJGBsCQOG
WhSnIj4UYwiBZwMB/lhvKGnyBEqKETCwfFm6pYo1ISpYRV3otoE9HjdyDBmSJMYEFE2ydOmSxcpZ
Ii5UQCVcuFsAxDlYuGhRMIYTKVOqSDlbRNUJqGsZFi6ASISIExcemCBSpIlv39dkBFbLeZ7sBghs
dPDw4YMFCiZcyBhCpPoQGZnTfohgbCpJDMdrbICXM8KJEyxatHAxWsUJEdq2cecJnqQsBxUiPIjw
IUSI8wC+15xUxRkHzjwdrIVQBMN44N+DUA1D2HHz1NeNBgdKxV0rrYTggIMVDObAfG65IhuG3TgA
AXfdxRNBMSx21sAsBzaAojwhebPQjtxw09ksDCmAgYU58ihPfRS6jpVBjQfMKJtU80yVpIw0zgNX
jSPJqKU3GWTAEAOCZLnllsfU6JMgU45JnwZezkMIAxRiOSYGbMp2QCFuDanmN2zW6JAjhYEnp4Ea
1NkQJE3mOeSi3wz5CookmQRJAVVVuGiXhRba5jwMSAqKAjI2aiFJfyrjhgGVqnmmqYOgquadrD4i
gAEJuKWAAQMoEwgAOw==


In [381]: f.close()
Die Daten kann man dann per Kopieren und Einfügen in den Quelltext übertragen.
Benutzeravatar
krisi12345
User
Beiträge: 205
Registriert: Mittwoch 4. März 2009, 16:56
Wohnort: Das schöne München
Kontaktdaten:

Dienstag 26. Mai 2009, 14:14

Bei mir kommt nur ein syntax error!
Benutzeravatar
krisi12345
User
Beiträge: 205
Registriert: Mittwoch 4. März 2009, 16:56
Wohnort: Das schöne München
Kontaktdaten:

Dienstag 26. Mai 2009, 14:40

Und wuf könntest du mal den Teil des Codes posten der dafür sorgt das das Bild über dem Fenster erscheint.
Ich kapier einfach nicht wo der ist!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 26. Mai 2009, 15:12

krisi12345 hat geschrieben:Bei mir kommt nur ein syntax error!
Weil du das logischerweise als String einfuegen musst und nicht "einfach so". Einfach so wird nur Python-Code verstanden, und der sieht ja nun doch etwas anders aus als Base64-Daten.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
wuf
User
Beiträge: 1419
Registriert: Sonntag 8. Juni 2003, 09:50

Dienstag 26. Mai 2009, 16:13

Hallo krisi12345

Ich benutze hierfür folgenden BASE-64-Converter:
http://homework.nwsnet.de/products/5d28 ... -converter

Installiere den Converter am besten in einem neuen Verzeichnis. Kopiere eine Symbol-Datei mit der .gif-Endung die du in das BASE64-Format umwandeln möchtest ins gleiche Verzeichnis. Starte den Converter. Lade die gif-Datei als 'Input'. Für den 'Output' benutze ein neuer Name vielleicht mit der Endung .b64. Selektiere den Radiobutton 'Encode'. Aktiviere anschliessend die Schaltfläche 'Convert'. Nun sollte automatisch eine Datei mit dem BASE64-Formatierten String im gleichen Verzeichnis erstellt worden sein. Öffne diese Datei mit deinem Editor und kopiere den String wie ich es in meinem Code-Schnippsel gezeigt habe in dein Skript.

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
krisi12345
User
Beiträge: 205
Registriert: Mittwoch 4. März 2009, 16:56
Wohnort: Das schöne München
Kontaktdaten:

Mittwoch 27. Mai 2009, 13:29

HI!
Der Konverter sieht nicht schlecht aus aber wenn Ich ihn kopiere oder sogar downloade kommt ein fehler in der 162ten und 152ten Zeile.
Benutzeravatar
wuf
User
Beiträge: 1419
Registriert: Sonntag 8. Juni 2003, 09:50

Mittwoch 27. Mai 2009, 14:25

...... Könntest du die ganze Fehlermeldung hier posten damit man herausfinden kann was das Problem ist. Bei mir funktioniert der Converter einwandfrei. Unter welchem Betriebsytem und Python-Version arbeitest du?

Gruss wuf :wink:
Take it easy Mates!
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Mittwoch 27. Mai 2009, 15:47

Hallo zusammen,
mit der Tkinter Ergänzung "Pmw" geht das ziemlich einfach mit den Tooltips/Balloons!

http://pmw.sourceforge.net/

siehe z.B. hier:

http://pmw.sourceforge.net/doc/Balloon.html

Und "Pmw" enthält noch so einige andere Nützliche Erweiterungen, die in Tkinter fehlen. Ein Blick lohnt sich.

Gruß
Stefan
Antworten