Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from tkinter import Tk, Toplevel, TclError, Label, Button
- class Tooltip:
- def __init__(self, widget, text, delay=750, duration=1500):
- self.widget = widget
- self._tooltip = None
- self._hide_id = None
- self._render_id = None
- self._tooltip_text = text
- self._tooltip_delay = delay
- self._tooltip_duration = duration
- 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._tooltip:
- self._tooltip = 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._tooltip.wm_geometry("+%d+%d" % (root_x, root_y))
- label = Label(
- self._tooltip,
- text=self._tooltip_text,
- justify='left',
- background="#ffffe0",
- relief='solid',
- borderwidth=1
- )
- label.pack()
- self._tooltip.update_idletasks() # Needed on MacOS -- see #34275.
- self._tooltip.lift()
- self._hide_id = self.widget.after(self._tooltip_duration, self.hide)
- 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, _=None):
- try:
- if self._hide_id:
- self.widget.after_cancel(self._hide_id)
- if self._render_id:
- self.widget.after_cancel(self._render_id)
- except TclError:
- pass
- tooltip = self._tooltip
- if self._tooltip:
- try:
- tooltip.destroy()
- except TclError:
- pass
- self._tooltip = None
- def app(parent):
- top = Toplevel(parent)
- top.title("Test tooltip")
- button1 = Button(top, text="Button 1")
- button1.pack()
- Tooltip(button1, "Tooltip for Button 1", delay=500, duration=1500)
- button2 = Button(top, text="Button 2")
- button2.pack()
- Tooltip(button2, "Tooltip for Button 2", delay=0, duration=1500)
- if __name__ == '__main__':
- tk = Tk()
- app(tk)
- tk.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement