如何检查鼠标是否在Python Tkinter中的小部件上?

ar7v8xwq  于 2023-06-07  发布在  Python
关注(0)|答案(1)|浏览(156)

我添加工具提示到我的程序,他们应该出现,如果鼠标在部件超过1秒。但是有一个问题,当鼠标简单地经过小部件时,工具提示总是会出现。我的意思是他们应该出现,如果鼠标停留在小部件超过1秒,但他们也出现时,鼠标不留在小部件。
所以我决定添加一些代码行,当鼠标进入小部件时延迟1秒,并检查鼠标是否仍在小部件上。如果鼠标仍在,则会显示工具提示。但我不知道如何检查鼠标是否在小部件上。我试过widget.focus_get(),但它只是给出了一个输出点。如果老鼠不在那里也会有一个点。所以这对我没用。我做了很多研究,但我找不到关于这个的东西。
我使用的是Python3.7.9和tkinter.ttk
我从here复制了代码,并对淡入淡出动画进行了一点点修改。下面是我的代码:

label = Label(root, text="Label")

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, widget):
        global tw
        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() + 20
        y = y + cy + self.widget.winfo_rooty() +20
        self.tipwindow = tw = Toplevel(self.widget)
        tw.wm_overrideredirect(1)
        tw.wm_geometry("+%d+%d" % (x, y))
        tw.attributes("-alpha", 0)
        label = Label(tw, text=self.text, justify=LEFT, relief=SOLID, borderwidth=1)
        label.pack(ipadx=1)
        def fade_in():
            alpha = tw.attributes("-alpha")
            if alpha < root.attributes("-alpha"):
                alpha += .1
                tw.attributes("-alpha", alpha)
                tw.after(10, fade_in)
            elif alpha == root.attributes("-alpha"):
                tw.attributes("-alpha", root.attributes("-alpha"))
                try:
                    tw.tk.call("::tk::unsupported::MacWindowStyle", "style", tw._w, "help", "noActivates")
                except TclError:
                    pass
        fade_in()
    def hidetip(self, widget):
        tw = self.tipwindow
        self.tipwindow = None
        def fade_away():
            alpha = tw.attributes("-alpha")
            if alpha > 0:
                alpha -= .1
                tw.attributes("-alpha", alpha)
                tw.after(10, fade_away)
            else:
                tw.destroy()
        fade_away()

def createToolTip(widget, text):
    toolTip = ToolTip(widget)
    def enter(event):
        time.sleep(1000) #Wait 1 second
        if widget.focus_get() == True: #Check if mouse is still on the widget. But not working.
            toolTip.showtip(text, widget)
    def leave(event):
        ToolTipActive = False
        toolTip.hidetip(widget)
    widget.bind('<Enter>', enter)
    widget.bind('<Leave>', leave)

createToolTip(label, "This is a tooltip")
zzwlnbp8

zzwlnbp81#

我不知道你的目标。你可以自己做一个tooltip/hovertip。如果你想自己做,你需要在悬停时使用bind

使用悬停提示:

from idlelib.tooltip import Hovertip
mytip = Hovertip(self, "Info")

例如:

import tkinter as tk
from idlelib.tooltip import Hovertip
    
app = tk.Tk()
app.geometry("400x400")
myBtn = tk.Button(app,text='?')
myBtn.pack(pady=30)
myTip = Hovertip(myBtn,'This is \na multiline tooltip.')
app.mainloop()

被盗自:How do I display tooltips in Tkinter?

悬停时使用绑定:(有不同的方式)

from tkinter import *

root = Tk()
root.geometry("400x400")

def hover_this_enter(_):  # on enter
    hover_lbl.place_configure(x=100, y=170)
    hover_lbl.after(1)  # after method (you can change)

def hover_this_leave(_):  # if you want to destroy, make sure you get this item back, or you get attribute errors
    hover_lbl.place_configure(x=-200)

btn = Button(root, text="give me tooltips")
btn.pack(side="left")
btn.bind("<Enter>", hover_this_enter)
btn.bind("<Leave>", hover_this_leave)
hover_lbl = Label(root, text="I was hovered", bg="black", fg="white")

if __name__ == '__main__':
    root.mainloop()

相关问题