Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from tkinter import Tk, Toplevel, TclError, Label, Button
- class Hovertip:
- def __init__(self, widget, text, delay):
- self.widget = widget
- self._tipwindow = None
- self._render_id = None
- self._tooltip_text = text
- self._tooltip_delay = delay
- self._enter_bind = self.widget.bind("<Enter>", self.show)
- self._leave_bind = self.widget.bind("<Leave>", self.hide)
- self._button_bind = self.widget.bind("<Button>", self.hide)
- def __del__(self):
- try:
- self.widget.unbind("<Enter>", self._enter_bind)
- self.widget.unbind("<Leave>", self._leave_bind)
- self.widget.unbind("<Button>", self._button_bind)
- except TclError:
- pass
- def show(self, _):
- def render():
- if not self._tipwindow:
- self._tipwindow = tw = Toplevel(self.widget)
- tw.wm_overrideredirect(True)
- x, y = 20, self.widget.winfo_height() + 1
- root_x = self.widget.winfo_rootx() + x
- root_y = self.widget.winfo_rooty() + y
- self._tipwindow.wm_geometry("+%d+%d" % (root_x, root_y))
- label = Label(
- self._tipwindow,
- text=self._tooltip_text,
- justify='left',
- background="#ffffe0",
- relief='solid',
- borderwidth=1
- )
- label.pack()
- self._tipwindow.update_idletasks()
- self._tipwindow.lift()
- if self._tooltip_delay:
- if self._render_id:
- self.widget.after_cancel(self._render_id)
- self._render_id = self.widget.after(self._tooltip_delay, render)
- else:
- render()
- def hide(self, _):
- if self._tipwindow:
- try:
- if self._render_id:
- self.widget.after_cancel(self._render_id)
- self._tipwindow.destroy()
- except TclError:
- pass
- self._tipwindow = None
- def app(parent):
- top = Toplevel(parent)
- top.title("Test tooltip")
- x, y = map(int, parent.geometry().split('+')[1:])
- top.geometry("+%d+%d" % (x, y + 150))
- label = Label(top, text="Place your mouse over buttons")
- label.pack()
- button1 = Button(top, text="Button 1 -- 1/2 second hover delay")
- button1.pack()
- Hovertip(button1, "This is tooltip text for button1.", delay=1000)
- button2 = Button(top, text="Button 2 -- no hover delay")
- button2.pack()
- Hovertip(button2, "This is tooltip\ntext for button2.", delay=0)
- if __name__ == '__main__':
- tk = Tk()
- app(tk)
- tk.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement