Advertisement
Uno-Dan

Untitled

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