在Python中将鼠标光标悬停在某些内容上时显示消息

mau*_*ius 14 python tkinter tooltip

我在Python中使用TKinter制作了一个GUI.我希望能够在鼠标光标移动时显示消息,例如,在标签或按钮的顶部.这样做的目的是向用户解释按钮/标签的作用或代表.

将鼠标悬停在Python中的tkinter对象上时,有没有办法显示文本?

Bry*_*ley 14

您需要在<Enter><Leave>事件上设置绑定.

注意:如果您选择弹出一个窗口(即:工具提示),请确保不要直接在鼠标下弹出它.会发生什么事情会导致离开事件,因为光标离开标签并进入弹出窗口.然后,您的离开处理程序将关闭该窗口,您的光标将进入标签,这会导致一个输入事件,该事件会弹出窗口,从而导致离开事件,该事件会关闭窗口,从而导致输入事件,...广告无穷.

这是一个仅更新标签的示例,类似于某些应用使用的状态栏.

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()
Run Code Online (Sandbox Code Playgroud)


squ*_*t17 12

我认为这可以满足您的要求。

输出如下所示:

输出

首先,我创建了一个名为的类ToolTip,其中包含方法showtiphidetip

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>', enter)
    widget.bind('<Leave>', leave)
Run Code Online (Sandbox Code Playgroud)

小部件是您要添加提示的位置。例如,如果您希望在将鼠标悬停在按钮,条目或标签上时使用提示,则应在通话时提供提示的实例。

快速说明:上面的代码使用from tkinter import * 了某些程序员不建议使用的代码,它们具有有效的意义。在这种情况下,您可能需要进行必要的更改。

要将笔尖移动到所需位置,可以在xy中进行更改。该功能CreateToolTip()有助于轻松创建该提示。只需将要显示在提示框中的小部件和字符串传递给此函数,就可以了。

这就是您称呼以上部分的方式:

button = Button(root, text = 'click mem')
button.pack()
CreateToolTip(button, text = 'Hello World\n'
                 'This is how tip looks like.'
                 'Best part is, it\'s not a menu.\n'
                 'Purely tipbox.')
Run Code Online (Sandbox Code Playgroud)

如果您将先前的大纲保存在其他python文件中,请不要忘记导入模块,也不要将文件另存为CreateToolTipToolTip以避免混淆。

  • 您的代码看起来非常接近此 http://www.voidspace.org.uk/python/weblog/arch_d7_2006_07_01.shtml#e387 您是该页面的所有者并将其重新发布到此处吗?如果没有,最好引用您的来源,而不是声称该代码是您自己的。 (2认同)

Alo*_*lok 10

你可以参考这个 - HoverClass

这正是你所需要的.没有更多,没有更少

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()
Run Code Online (Sandbox Code Playgroud)

使用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()
Run Code Online (Sandbox Code Playgroud)

截图:

测试hoverbox

  • 虽然这个解决方案很聪明,但“HoverInfo”的行为更像是一个项目菜单,而不是一个静态信息框。 (2认同)
  • 嗨,即使它在Enter上加载,但如果我离开父窗口小部件,它也不会自行删除。我必须单击父项以使其消失。有什么想法吗? (2认同)