Server IP : 103.119.228.120 / Your IP : 3.144.40.216 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 : /usr/lib/mysqlsh/lib/python3.9/idlelib/ |
Upload File : |
"""A call-tip window class for Tkinter/IDLE. After tooltip.py, which uses ideas gleaned from PySol. Used by calltip.py. """ from tkinter import Label, LEFT, SOLID, TclError from idlelib.tooltip import TooltipBase HIDE_EVENT = "<<calltipwindow-hide>>" HIDE_SEQUENCES = ("<Key-Escape>", "<FocusOut>") CHECKHIDE_EVENT = "<<calltipwindow-checkhide>>" CHECKHIDE_SEQUENCES = ("<KeyRelease>", "<ButtonRelease>") CHECKHIDE_TIME = 100 # milliseconds MARK_RIGHT = "calltipwindowregion_right" class CalltipWindow(TooltipBase): """A call-tip widget for tkinter text widgets.""" def __init__(self, text_widget): """Create a call-tip; shown by showtip(). text_widget: a Text widget with code for which call-tips are desired """ # Note: The Text widget will be accessible as self.anchor_widget super(CalltipWindow, self).__init__(text_widget) self.label = self.text = None self.parenline = self.parencol = self.lastline = None self.hideid = self.checkhideid = None self.checkhide_after_id = None def get_position(self): """Choose the position of the call-tip.""" curline = int(self.anchor_widget.index("insert").split('.')[0]) if curline == self.parenline: anchor_index = (self.parenline, self.parencol) else: anchor_index = (curline, 0) box = self.anchor_widget.bbox("%d.%d" % anchor_index) if not box: box = list(self.anchor_widget.bbox("insert")) # align to left of window box[0] = 0 box[2] = 0 return box[0] + 2, box[1] + box[3] def position_window(self): "Reposition the window if needed." curline = int(self.anchor_widget.index("insert").split('.')[0]) if curline == self.lastline: return self.lastline = curline self.anchor_widget.see("insert") super(CalltipWindow, self).position_window() def showtip(self, text, parenleft, parenright): """Show the call-tip, bind events which will close it and reposition it. text: the text to display in the call-tip parenleft: index of the opening parenthesis in the text widget parenright: index of the closing parenthesis in the text widget, or the end of the line if there is no closing parenthesis """ # Only called in calltip.Calltip, where lines are truncated self.text = text if self.tipwindow or not self.text: return self.anchor_widget.mark_set(MARK_RIGHT, parenright) self.parenline, self.parencol = map( int, self.anchor_widget.index(parenleft).split(".")) super(CalltipWindow, self).showtip() self._bind_events() def showcontents(self): """Create the call-tip widget.""" self.label = Label(self.tipwindow, text=self.text, justify=LEFT, background="#ffffd0", foreground="black", relief=SOLID, borderwidth=1, font=self.anchor_widget['font']) self.label.pack() def checkhide_event(self, event=None): """Handle CHECK_HIDE_EVENT: call hidetip or reschedule.""" if not self.tipwindow: # If the event was triggered by the same event that unbound # this function, the function will be called nevertheless, # so do nothing in this case. return None # Hide the call-tip if the insertion cursor moves outside of the # parenthesis. curline, curcol = map(int, self.anchor_widget.index("insert").split('.')) if curline < self.parenline or \ (curline == self.parenline and curcol <= self.parencol) or \ self.anchor_widget.compare("insert", ">", MARK_RIGHT): self.hidetip() return "break" # Not hiding the call-tip. self.position_window() # Re-schedule this function to be called again in a short while. if self.checkhide_after_id is not None: self.anchor_widget.after_cancel(self.checkhide_after_id) self.checkhide_after_id = \ self.anchor_widget.after(CHECKHIDE_TIME, self.checkhide_event) return None def hide_event(self, event): """Handle HIDE_EVENT by calling hidetip.""" if not self.tipwindow: # See the explanation in checkhide_event. return None self.hidetip() return "break" def hidetip(self): """Hide the call-tip.""" if not self.tipwindow: return try: self.label.destroy() except TclError: pass self.label = None self.parenline = self.parencol = self.lastline = None try: self.anchor_widget.mark_unset(MARK_RIGHT) except TclError: pass try: self._unbind_events() except (TclError, ValueError): # ValueError may be raised by MultiCall pass super(CalltipWindow, self).hidetip() def _bind_events(self): """Bind event handlers.""" self.checkhideid = self.anchor_widget.bind(CHECKHIDE_EVENT, self.checkhide_event) for seq in CHECKHIDE_SEQUENCES: self.anchor_widget.event_add(CHECKHIDE_EVENT, seq) self.anchor_widget.after(CHECKHIDE_TIME, self.checkhide_event) self.hideid = self.anchor_widget.bind(HIDE_EVENT, self.hide_event) for seq in HIDE_SEQUENCES: self.anchor_widget.event_add(HIDE_EVENT, seq) def _unbind_events(self): """Unbind event handlers.""" for seq in CHECKHIDE_SEQUENCES: self.anchor_widget.event_delete(CHECKHIDE_EVENT, seq) self.anchor_widget.unbind(CHECKHIDE_EVENT, self.checkhideid) self.checkhideid = None for seq in HIDE_SEQUENCES: self.anchor_widget.event_delete(HIDE_EVENT, seq) self.anchor_widget.unbind(HIDE_EVENT, self.hideid) self.hideid = None def _calltip_window(parent): # htest # from tkinter import Toplevel, Text, LEFT, BOTH top = Toplevel(parent) top.title("Test call-tips") x, y = map(int, parent.geometry().split('+')[1:]) top.geometry("250x100+%d+%d" % (x + 175, y + 150)) text = Text(top) text.pack(side=LEFT, fill=BOTH, expand=1) text.insert("insert", "string.split") top.update() calltip = CalltipWindow(text) def calltip_show(event): calltip.showtip("(s='Hello world')", "insert", "end") def calltip_hide(event): calltip.hidetip() text.event_add("<<calltip-show>>", "(") text.event_add("<<calltip-hide>>", ")") text.bind("<<calltip-show>>", calltip_show) text.bind("<<calltip-hide>>", calltip_hide) text.focus_set() if __name__ == '__main__': from unittest import main main('idlelib.idle_test.test_calltip_w', verbosity=2, exit=False) from idlelib.idle_test.htest import run run(_calltip_window)