mirror of
https://github.com/TomSchimansky/CustomTkinter.git
synced 2023-08-10 21:13:13 +03:00
Tooltip improvements
- Fix .configure() not working - Fix tooltips sometimes not disappearing - Add is_visible() method to return visibility status
This commit is contained in:
@@ -22,8 +22,10 @@ class CTkTooltip(CTkToplevel):
|
|||||||
self.text = text # text to display
|
self.text = text # text to display
|
||||||
self.mouse_offset = mouse_offset # offset from mouse position (x, y)
|
self.mouse_offset = mouse_offset # offset from mouse position (x, y)
|
||||||
self.master.bind("<Enter>", self._schedule, add="+")
|
self.master.bind("<Enter>", self._schedule, add="+")
|
||||||
self.master.bind("<Leave>", lambda e: self.master.after(5, self._leave), add="+")
|
self.master.bind("<Leave>", self._leave)
|
||||||
self.master.bind("<ButtonPress>", self._leave, add="+")
|
self.master.bind("<ButtonPress>", self._leave, add="+")
|
||||||
|
label = self.master.winfo_children()[0]
|
||||||
|
label.bind("<Enter>", self._schedule, add="+")
|
||||||
self._id = None
|
self._id = None
|
||||||
self.kwargs = kwargs
|
self.kwargs = kwargs
|
||||||
self._visible = False
|
self._visible = False
|
||||||
@@ -55,13 +57,15 @@ class CTkTooltip(CTkToplevel):
|
|||||||
else:
|
else:
|
||||||
self.bg_color = bg_color
|
self.bg_color = bg_color
|
||||||
|
|
||||||
|
|
||||||
def _leave(self, event=None):
|
def _leave(self, event=None):
|
||||||
if not self._is_hovering_tooltip:
|
self._unschedule()
|
||||||
self._unschedule()
|
print("leave")
|
||||||
if self._visible: self.hide()
|
if self._visible: self.hide()
|
||||||
self._visible = False
|
|
||||||
|
|
||||||
def _schedule(self, event=None):
|
def _schedule(self, event=None):
|
||||||
|
print("schedule")
|
||||||
|
self._unschedule()
|
||||||
self._id = self.master.after(self.wait_time, self.show)
|
self._id = self.master.after(self.wait_time, self.show)
|
||||||
|
|
||||||
def _unschedule(self):
|
def _unschedule(self):
|
||||||
@@ -71,16 +75,8 @@ class CTkTooltip(CTkToplevel):
|
|||||||
if id:
|
if id:
|
||||||
self.master.after_cancel(id)
|
self.master.after_cancel(id)
|
||||||
|
|
||||||
def _tt_enter(self, event=None):
|
|
||||||
if not self._is_hovering_tooltip:
|
|
||||||
self._is_hovering_tooltip = True
|
|
||||||
|
|
||||||
def _tt_leave(self, event=None):
|
|
||||||
if self._is_hovering_tooltip:
|
|
||||||
self._is_hovering_tooltip = False
|
|
||||||
self._leave()
|
|
||||||
|
|
||||||
def show(self, event=None):
|
def show(self, event=None):
|
||||||
|
print("show")
|
||||||
# Get the position the tooltip needs to appear at
|
# Get the position the tooltip needs to appear at
|
||||||
super().__init__(self.master)
|
super().__init__(self.master)
|
||||||
super().withdraw() # hide and reshow window once all code is ran to fix issues due to slower machines (??)
|
super().withdraw() # hide and reshow window once all code is ran to fix issues due to slower machines (??)
|
||||||
@@ -104,42 +100,40 @@ class CTkTooltip(CTkToplevel):
|
|||||||
self.wm_geometry(f'+{x}+{y}')
|
self.wm_geometry(f'+{x}+{y}')
|
||||||
label = CTkLabel(self, text=self.text, corner_radius=10, bg_color=self.bg_color, fg_color=self.fg_color, width=1, wraplength=self.wrap_length, **self.kwargs)
|
label = CTkLabel(self, text=self.text, corner_radius=10, bg_color=self.bg_color, fg_color=self.fg_color, width=1, wraplength=self.wrap_length, **self.kwargs)
|
||||||
label.pack()
|
label.pack()
|
||||||
label.bind("<Enter>", self._tt_enter, add="+")
|
|
||||||
label.bind("<Leave>", self._tt_leave, add="+")
|
|
||||||
if sys.platform == 'darwin': label.configure(bg_color='systemTransparent')
|
if sys.platform == 'darwin': label.configure(bg_color='systemTransparent')
|
||||||
|
label.bind("<Enter>", self._leave, add="+")
|
||||||
super().deiconify()
|
super().deiconify()
|
||||||
|
|
||||||
def hide(self):
|
def hide(self):
|
||||||
|
print("hide")
|
||||||
self._unschedule()
|
self._unschedule()
|
||||||
self.withdraw()
|
self.withdraw()
|
||||||
|
self._visible = False
|
||||||
|
|
||||||
def configure(self, **kwargs):
|
def configure(self, **kwargs):
|
||||||
# Change attributes of the tooltip, and redraw if necessary
|
# Change attributes of the tooltip, and redraw if necessary
|
||||||
require_redraw = False
|
require_redraw = False
|
||||||
if "fg_color" in kwargs:
|
if "fg_color" in kwargs:
|
||||||
self.fg_color = kwargs["fg_color"]
|
self.fg_color = kwargs.pop("fg_color")
|
||||||
require_redraw = True
|
require_redraw = True
|
||||||
del kwargs["fg_color"]
|
|
||||||
if "bg_color" in kwargs:
|
if "bg_color" in kwargs:
|
||||||
self.bg_color = kwargs["bg_color"]
|
self.bg_color = kwargs.pop("bg_color")
|
||||||
require_redraw = True
|
require_redraw = True
|
||||||
del kwargs["bg_color"]
|
|
||||||
if "text" in kwargs:
|
if "text" in kwargs:
|
||||||
self.text = kwargs["text"]
|
self.text = kwargs.pop("text")
|
||||||
require_redraw = True
|
require_redraw = True
|
||||||
del kwargs["text"]
|
|
||||||
if "delay" in kwargs:
|
if "delay" in kwargs:
|
||||||
self.wait_time = kwargs["delay"]
|
self.wait_time = kwargs.pop("delay")
|
||||||
del kwargs["delay"]
|
|
||||||
if "wrap_length" in kwargs:
|
if "wrap_length" in kwargs:
|
||||||
self.wrap_length = kwargs["wrap_length"]
|
self.wrap_length = kwargs.pop("wrap_length")
|
||||||
require_redraw = True
|
require_redraw = True
|
||||||
del kwargs["wrap_length"]
|
|
||||||
if "mouse_offset" in kwargs:
|
if "mouse_offset" in kwargs:
|
||||||
self.mouse_offset = kwargs["mouse_offset"]
|
self.mouse_offset = kwargs.pop("mouse_offset")
|
||||||
require_redraw = True
|
require_redraw = True
|
||||||
del kwargs["mouse_offset"]
|
self.kwargs = kwargs
|
||||||
super().configure(**kwargs)
|
|
||||||
if require_redraw:
|
if require_redraw:
|
||||||
self.hide()
|
self.hide()
|
||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
|
def is_visible(self):
|
||||||
|
return self._visible
|
||||||
|
|||||||
Reference in New Issue
Block a user