Server IP : 103.119.228.120 / Your IP : 18.227.209.214 Web Server : Apache System : Linux v8.techscape8.com 3.10.0-1160.119.1.el7.tuxcare.els2.x86_64 #1 SMP Mon Jul 15 12:09:18 UTC 2024 x86_64 User : nobody ( 99) PHP Version : 5.6.40 Disable Function : shell_exec,symlink,system,exec,proc_get_status,proc_nice,proc_terminate,define_syslog_variables,syslog,openlog,closelog,escapeshellcmd,passthru,ocinum cols,ini_alter,leak,listen,chgrp,apache_note,apache_setenv,debugger_on,debugger_off,ftp_exec,dl,dll,myshellexec,proc_open,socket_bind,proc_close,escapeshellarg,parse_ini_filepopen,fpassthru,exec,passthru,escapeshellarg,escapeshellcmd,proc_close,proc_open,ini_alter,popen,show_source,proc_nice,proc_terminate,proc_get_status,proc_close,pfsockopen,leak,apache_child_terminate,posix_kill,posix_mkfifo,posix_setpgid,posix_setsid,posix_setuid,dl,symlink,shell_exec,system,dl,passthru,escapeshellarg,escapeshellcmd,myshellexec,c99_buff_prepare,c99_sess_put,fpassthru,getdisfunc,fx29exec,fx29exec2,is_windows,disp_freespace,fx29sh_getupdate,fx29_buff_prepare,fx29_sess_put,fx29shexit,fx29fsearch,fx29ftpbrutecheck,fx29sh_tools,fx29sh_about,milw0rm,imagez,sh_name,myshellexec,checkproxyhost,dosyayicek,c99_buff_prepare,c99_sess_put,c99getsource,c99sh_getupdate,c99fsearch,c99shexit,view_perms,posix_getpwuid,posix_getgrgid,posix_kill,parse_perms,parsesort,view_perms_color,set_encoder_input,ls_setcheckboxall,ls_reverse_all,rsg_read,rsg_glob,selfURL,dispsecinfo,unix2DosTime,addFile,system,get_users,view_size,DirFiles,DirFilesWide,DirPrintHTMLHeaders,GetFilesTotal,GetTitles,GetTimeTotal,GetMatchesCount,GetFileMatchesCount,GetResultFiles,fs_copy_dir,fs_copy_obj,fs_move_dir,fs_move_obj,fs_rmdir,SearchText,getmicrotime MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /lib/mysqlsh/lib/python3.9/idlelib/ |
Upload File : |
"""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: """abstract base class for tooltips""" def __init__(self, anchor_widget): """Create a tooltip. anchor_widget: the widget next to which the tooltip will be shown Note that a widget will only be shown when showtip() is called. """ self.anchor_widget = anchor_widget self.tipwindow = None def __del__(self): self.hidetip() def showtip(self): """display the tooltip""" if self.tipwindow: return self.tipwindow = tw = Toplevel(self.anchor_widget) # show no border on the top level window tw.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: pass self.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() + x root_y = self.anchor_widget.winfo_rooty() + y self.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() + 1 def showcontents(self): """content display hook for sub-classes""" # See ToolTip for an example raise NotImplementedError def hidetip(self): """hide the tooltip""" # Note: This is called by __del__, so careful when overriding/extending tw = self.tipwindow self.tipwindow = None if tw: try: tw.destroy() except TclError: # pragma: no cover pass class 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 shown hover_delay: time to delay before showing the tooltip, in milliseconds Note that a widget will only be shown when showtip() is called, e.g. after hovering over the anchor widget with the mouse for enough time. """ super(OnHoverTooltipBase, self).__init__(anchor_widget) self.hover_delay = hover_delay self._after_id = None self._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 cover self.anchor_widget.unbind("<Button>", self._id3) # pragma: no cover except TclError: pass super(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_id self._after_id = None if after_id: self.anchor_widget.after_cancel(after_id) def hidetip(self): """hide the tooltip""" try: self.unschedule() except TclError: # pragma: no cover pass super(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 shown hover_delay: time to delay before showing the tooltip, in milliseconds Note that a widget will only be shown when showtip() is called, e.g. after hovering over the anchor widget with the mouse for enough time. """ super(Hovertip, self).__init__(anchor_widget, hover_delay=hover_delay) self.text = text def 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 main main('idlelib.idle_test.test_tooltip', verbosity=2, exit=False) from idlelib.idle_test.htest import run run(_tooltip)