Saltar al contenido

Mostrar mensaje al pasar el mouse sobre algo con el cursor del mouse en Python

Estate atento porque en esta sección vas a hallar la solución que buscas.

Solución:

Creo que esto cumpliría con sus requisitos.

Así es como se ve la salida:

La salida

Primero, una clase llamada ToolTip que tiene métodos showtip y hidetip se define de la siguiente manera:

from tkinter import *

class ToolTip(object):

    def __init__(self, widget):
        self.widget = widget
        self.tipwindow = None
        self.id = None
        self.x = self.y = 0

    def showtip(self, text):
        "Display text in tooltip window"
        self.text = text
        if self.tipwindow or not self.text:
            return
        x, y, cx, cy = self.widget.bbox("insert")
        x = x + self.widget.winfo_rootx() + 57
        y = y + cy + self.widget.winfo_rooty() +27
        self.tipwindow = tw = Toplevel(self.widget)
        tw.wm_overrideredirect(1)
        tw.wm_geometry("+%d+%d" % (x, y))
        label = Label(tw, text=self.text, justify=LEFT,
                      background="#ffffe0", relief=SOLID, borderwidth=1,
                      font=("tahoma", "8", "normal"))
        label.pack(ipadx=1)

    def hidetip(self):
        tw = self.tipwindow
        self.tipwindow = None
        if tw:
            tw.destroy()

def CreateToolTip(widget, text):
    toolTip = ToolTip(widget)
    def enter(event):
        toolTip.showtip(text)
    def leave(event):
        toolTip.hidetip()
    widget.bind('', enter)
    widget.bind('', leave)

El widget es donde desea agregar la sugerencia. Por ejemplo, si desea la sugerencia cuando pasa el mouse sobre un botón, una entrada o una etiqueta, la instancia de la misma debe proporcionarse en el momento de la llamada.

Nota rápida: el código anterior utiliza from tkinter import *
lo cual no es sugerido por algunos de los programadores, y tienen puntos válidos. Es posible que desee realizar los cambios necesarios en tal caso.

Para mover la punta a la ubicación deseada, puede cambiar x y y en el código. La función CreateToolTip() ayuda a crear este consejo fácilmente. Solo pasa el widget y string desea mostrar en el tipbox a esta función, y está listo para comenzar.

Así es como llamas a la parte anterior:

button = Button(root, text = 'click mem')
button.pack()
CreateToolTip(button, text = 'Hello Worldn'
                 'This is how tip looks like.'
                 'Best part is, it's not a menu.n'
                 'Purely tipbox.')

No olvide importar el módulo si guarda el esquema anterior en un archivo python diferente y no guarde el archivo como CreateToolTip o ToolTip para evitar confusión. Esta publicación de Fuzzyman comparte algunos pensamientos similares y vale la pena echarle un vistazo.

Necesita establecer un enlace en el y eventos.

Nota: si elige abrir una ventana emergente (es decir, una información sobre herramientas), asegúrese de no abrirla directamente debajo del mouse. Lo que sucederá es que hará que se active un evento de salida porque el cursor sale de la etiqueta y entra en la ventana emergente. Luego, su controlador de salida descartará la ventana, su cursor ingresará en la etiqueta, lo que provoca un evento de entrada, que abre la ventana, lo que provoca un evento de salida, que descarta la ventana, lo que provoca un evento de entrada, … ad infinito.

Para simplificar, aquí hay un ejemplo que actualiza una etiqueta, similar a una barra de estado que usan algunas aplicaciones. La creación de una información sobre herramientas o alguna otra forma de mostrar la información aún comienza con la misma técnica central de enlace a y .

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        self.l1 = tk.Label(self, text="Hover over me")
        self.l2 = tk.Label(self, text="", width=40)
        self.l1.pack(side="top")
        self.l2.pack(side="top", fill="x")

        self.l1.bind("", self.on_enter)
        self.l1.bind("", self.on_leave)

    def on_enter(self, event):
        self.l2.configure(text="Hello world")

    def on_leave(self, enter):
        self.l2.configure(text="")

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(side="top", fill="both", expand="true")
    root.mainloop()

Puede consultar esto: HoverClass

Es exactamente lo que necesitas. Nada más y nada menos

from Tkinter import *
import re

class HoverInfo(Menu):
    def __init__(self, parent, text, command=None):
       self._com = command
       Menu.__init__(self,parent, tearoff=0)
       if not isinstance(text, str):
          raise TypeError('Trying to initialise a Hover Menu with a non string type: ' + text.__class__.__name__)
       toktext=re.split('n', text)
       for t in toktext:
          self.add_command(label = t)
       self._displayed=False
          self.master.bind("",self.Display )
          self.master.bind("",self.Remove )

    def __del__(self):
       self.master.unbind("")
       self.master.unbind("")

    def Display(self,event):
       if not self._displayed:
          self._displayed=True
          self.post(event.x_root, event.y_root)
       if self._com != None:
          self.master.unbind_all("")
          self.master.bind_all("", self.Click)

    def Remove(self, event):
     if self._displayed:
       self._displayed=False
       self.unpost()
     if self._com != None:
       self.unbind_all("")

    def Click(self, event):
       self._com()

Aplicación de ejemplo que usa HoverInfo:

from Tkinter import *
from HoverInfo import HoverInfo
class MyApp(Frame):
   def __init__(self, parent=None):
      Frame.__init__(self, parent)
      self.grid()
      self.lbl = Label(self, text='testing')
      self.lbl.grid()

      self.hover = HoverInfo(self, 'while hovering press return n for an exciting msg', self.HelloWorld)

   def HelloWorld(self):
      print('Hello World')

app = MyApp()
app.master.title('test')
app.mainloop()

Captura de pantalla:

Probando la caja flotante

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *