Advertisement
Uno-Dan

Untitled

Jan 3rd, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.90 KB | None | 0 0
  1. from tkinter import Tk, Toplevel, TclError, Label, Button
  2.  
  3.  
  4. class Tooltip:
  5.     def __init__(self, widget, text, delay=750, duration=1500):
  6.         self.widget = widget
  7.         self._tooltip = None
  8.  
  9.         self._hide_id = None
  10.         self._render_id = None
  11.         self._tooltip_text = text
  12.         self._tooltip_delay = delay
  13.         self._tooltip_duration = duration
  14.  
  15.         self._enter_bind = self.widget.bind("<Enter>", self.show)
  16.         self._leave_bind = self.widget.bind("<Leave>", self.hide)
  17.         self._button_bind = self.widget.bind("<Button>", self.hide)
  18.  
  19.     def __del__(self):
  20.         try:
  21.             self.widget.unbind("<Enter>", self._enter_bind)
  22.             self.widget.unbind("<Leave>", self._leave_bind)
  23.             self.widget.unbind("<Button>", self._button_bind)
  24.         except TclError:
  25.             pass
  26.  
  27.     def show(self, _):
  28.         def render():
  29.             if not self._tooltip:
  30.                 self._tooltip = tw = Toplevel(self.widget)
  31.                 tw.wm_overrideredirect(True)
  32.  
  33.                 x, y = 20, self.widget.winfo_height() + 1
  34.                 root_x = self.widget.winfo_rootx() + x
  35.                 root_y = self.widget.winfo_rooty() + y
  36.                 self._tooltip.wm_geometry("+%d+%d" % (root_x, root_y))
  37.  
  38.                 label = Label(
  39.                     self._tooltip,
  40.                     text=self._tooltip_text,
  41.                     justify='left',
  42.                     background="#ffffe0",
  43.                     relief='solid',
  44.                     borderwidth=1
  45.                 )
  46.                 label.pack()
  47.                 self._tooltip.update_idletasks()  # Needed on MacOS -- see #34275.
  48.                 self._tooltip.lift()
  49.                 self._hide_id = self.widget.after(self._tooltip_duration, self.hide)
  50.  
  51.         if self._tooltip_delay:
  52.             if self._render_id:
  53.                 self.widget.after_cancel(self._render_id)
  54.             self._render_id = self.widget.after(self._tooltip_delay, render)
  55.         else:
  56.             render()
  57.  
  58.     def hide(self, _=None):
  59.         try:
  60.             if self._hide_id:
  61.                 self.widget.after_cancel(self._hide_id)
  62.             if self._render_id:
  63.                 self.widget.after_cancel(self._render_id)
  64.         except TclError:
  65.             pass
  66.  
  67.         tooltip = self._tooltip
  68.         if self._tooltip:
  69.             try:
  70.                 tooltip.destroy()
  71.             except TclError:
  72.                 pass
  73.             self._tooltip = None
  74.  
  75.  
  76. def app(parent):
  77.     top = Toplevel(parent)
  78.     top.title("Test tooltip")
  79.  
  80.     button1 = Button(top, text="Button 1")
  81.     button1.pack()
  82.     Tooltip(button1, "Tooltip for Button 1", delay=500, duration=1500)
  83.  
  84.     button2 = Button(top, text="Button 2")
  85.     button2.pack()
  86.     Tooltip(button2, "Tooltip for Button 2", delay=0, duration=1500)
  87.  
  88.  
  89. if __name__ == '__main__':
  90.     tk = Tk()
  91.  
  92.     app(tk)
  93.  
  94.     tk.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement