Advertisement
Uno-Dan

Untitled

Jan 3rd, 2019
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.85 KB | None | 0 0
  1.  
  2. from tkinter import Tk, Toplevel, TclError, Label, Button
  3.  
  4.  
  5. class Hovertip(object):
  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()  # Needed on MacOS -- see #34275.
  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.         try:
  58.             if self._render_id:
  59.                 self.widget.after_cancel(self._render_id)
  60.         except TclError:
  61.             pass
  62.  
  63.         tw = self._tipwindow
  64.         self._tipwindow = None
  65.         if tw:
  66.             try:
  67.                 tw.destroy()
  68.             except TclError:
  69.                 pass
  70.  
  71.  
  72. def app(parent):
  73.     top = Toplevel(parent)
  74.     top.title("Test tooltip")
  75.     x, y = map(int, parent.geometry().split('+')[1:])
  76.     top.geometry("+%d+%d" % (x, y + 150))
  77.  
  78.     label = Label(top, text="Place your mouse over buttons")
  79.     label.pack()
  80.  
  81.     button1 = Button(top, text="Button 1 -- 1/2 second hover delay")
  82.     button1.pack()
  83.     Hovertip(button1, "This is tooltip text for button1.", delay=1000)
  84.  
  85.     button2 = Button(top, text="Button 2 -- no hover delay")
  86.     button2.pack()
  87.     Hovertip(button2, "This is tooltip\ntext for button2.", delay=0)
  88.  
  89.  
  90. if __name__ == '__main__':
  91.     tk = Tk()
  92.  
  93.     app(tk)
  94.  
  95.     tk.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement