Отображение сообщения при наведении курсора мыши на что-либо в Python

У меня есть графический интерфейс, сделанный с TKinter в Python. Я хотел бы иметь возможность отображать сообщение, когда мой курсор мыши идет, например, поверх метки или кнопки. Цель этого-объяснить пользователю, что делает или представляет собой кнопка/метка.

есть ли способ отображения текста при наведении курсора на объект tkinter в Python?

2 ответов


вам нужно установить привязку на <Enter> и <Leave> событий.

Примечание: Если вы выбираете всплывающее окно (т. е. подсказку), убедитесь, что вы не всплываете непосредственно под мышью. Произойдет то, что это вызовет запуск события leave, потому что курсор покидает метку и входит во всплывающее окно. Затем ваш обработчик отпуска отклонит окно, ваш курсор введет метку, которая вызывает событие enter, которое всплывает в окне, которое вызывает событие leave, которое отклоняет окно, которое вызывает событие enter, ... до бесконечности.

вот пример, который просто обновляет метку, аналогичную строке состояния, которую используют некоторые приложения.

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("<Enter>", self.on_enter)
        self.l1.bind("<Leave>", 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()

вы можете обратиться к этому- HoverClass

это именно то, что вам нужно. Ни больше, ни меньше!--5-->

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("<Enter>",self.Display )
          self.master.bind("<Leave>",self.Remove )

    def __del__(self):
       self.master.unbind("<Enter>")
       self.master.unbind("<Leave>")

    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("<Return>")
          self.master.bind_all("<Return>", self.Click)

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

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

пример приложения с помощью 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()

скриншоты:

Testing hoverbox