"""Tools for displaying tool-tips.This includes:* an abstract base-class for different kinds of tooltips* a simple text-only Tooltip class"""from tkinter import *class TooltipBase(object):"""abstract base class for tooltips"""def __init__(self, anchor_widget):"""Create a tooltip.anchor_widget: the widget next to which the tooltip will be shownNote that a widget will only be shown when showtip() is called."""self.anchor_widget = anchor_widgetself.tipwindow = Nonedef __del__(self):self.hidetip()def showtip(self):"""display the tooltip"""if self.tipwindow:returnself.tipwindow = tw = Toplevel(self.anchor_widget)# show no border on the top level windowtw.wm_overrideredirect(1)try:# This command is only needed and available on Tk >= 8.4.0 for OSX.# Without it, call tips intrude on the typing process by grabbing# the focus.tw.tk.call("::tk::unsupported::MacWindowStyle", "style", tw._w,"help", "noActivates")except TclError:passself.position_window()self.showcontents()self.tipwindow.update_idletasks() # Needed on MacOS -- see #34275.self.tipwindow.lift() # work around bug in Tk 8.5.18+ (issue #24570)def position_window(self):"""(re)-set the tooltip's screen position"""x, y = self.get_position()root_x = self.anchor_widget.winfo_rootx() + xroot_y = self.anchor_widget.winfo_rooty() + yself.tipwindow.wm_geometry("+%d+%d" % (root_x, root_y))def get_position(self):"""choose a screen position for the tooltip"""# The tip window must be completely outside the anchor widget;# otherwise when the mouse enters the tip window we get# a leave event and it disappears, and then we get an enter# event and it reappears, and so on forever :-(## Note: This is a simplistic implementation; sub-classes will likely# want to override this.return 20, self.anchor_widget.winfo_height() + 1def showcontents(self):"""content display hook for sub-classes"""# See ToolTip for an exampleraise NotImplementedErrordef hidetip(self):"""hide the tooltip"""# Note: This is called by __del__, so careful when overriding/extendingtw = self.tipwindowself.tipwindow = Noneif tw:try:tw.destroy()except TclError: # pragma: no coverpassclass OnHoverTooltipBase(TooltipBase):"""abstract base class for tooltips, with delayed on-hover display"""def __init__(self, anchor_widget, hover_delay=1000):"""Create a tooltip with a mouse hover delay.anchor_widget: the widget next to which the tooltip will be shownhover_delay: time to delay before showing the tooltip, in millisecondsNote that a widget will only be shown when showtip() is called,e.g. after hovering over the anchor widget with the mouse for enoughtime."""super(OnHoverTooltipBase, self).__init__(anchor_widget)self.hover_delay = hover_delayself._after_id = Noneself._id1 = self.anchor_widget.bind("<Enter>", self._show_event)self._id2 = self.anchor_widget.bind("<Leave>", self._hide_event)self._id3 = self.anchor_widget.bind("<Button>", self._hide_event)def __del__(self):try:self.anchor_widget.unbind("<Enter>", self._id1)self.anchor_widget.unbind("<Leave>", self._id2) # pragma: no coverself.anchor_widget.unbind("<Button>", self._id3) # pragma: no coverexcept TclError:passsuper(OnHoverTooltipBase, self).__del__()def _show_event(self, event=None):"""event handler to display the tooltip"""if self.hover_delay:self.schedule()else:self.showtip()def _hide_event(self, event=None):"""event handler to hide the tooltip"""self.hidetip()def schedule(self):"""schedule the future display of the tooltip"""self.unschedule()self._after_id = self.anchor_widget.after(self.hover_delay,self.showtip)def unschedule(self):"""cancel the future display of the tooltip"""after_id = self._after_idself._after_id = Noneif after_id:self.anchor_widget.after_cancel(after_id)def hidetip(self):"""hide the tooltip"""try:self.unschedule()except TclError: # pragma: no coverpasssuper(OnHoverTooltipBase, self).hidetip()class Hovertip(OnHoverTooltipBase):"A tooltip that pops up when a mouse hovers over an anchor widget."def __init__(self, anchor_widget, text, hover_delay=1000):"""Create a text tooltip with a mouse hover delay.anchor_widget: the widget next to which the tooltip will be shownhover_delay: time to delay before showing the tooltip, in millisecondsNote that a widget will only be shown when showtip() is called,e.g. after hovering over the anchor widget with the mouse for enoughtime."""super(Hovertip, self).__init__(anchor_widget, hover_delay=hover_delay)self.text = textdef showcontents(self):label = Label(self.tipwindow, text=self.text, justify=LEFT,background="#ffffe0", relief=SOLID, borderwidth=1)label.pack()def _tooltip(parent): # htest #top = Toplevel(parent)top.title("Test tooltip")x, y = map(int, parent.geometry().split('+')[1:])top.geometry("+%d+%d" % (x, y + 150))label = Label(top, text="Place your mouse over buttons")label.pack()button1 = Button(top, text="Button 1 -- 1/2 second hover delay")button1.pack()Hovertip(button1, "This is tooltip text for button1.", hover_delay=500)button2 = Button(top, text="Button 2 -- no hover delay")button2.pack()Hovertip(button2, "This is tooltip\ntext for button2.", hover_delay=None)if __name__ == '__main__':from unittest import mainmain('idlelib.idle_test.test_tooltip', verbosity=2, exit=False)from idlelib.idle_test.htest import runrun(_tooltip)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。