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:
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: