M CallTipWindow.py

M CallTips.py

Calltip fetch was erroring when an Edit window was used without a Shell.
Also, fix CallTipWindow.py so test code will run and add a comment about a
bug which causes the calltip window to override all others.
This commit is contained in:
Kurt B. Kaiser 2002-12-12 19:15:39 +00:00
parent 7e5c6a02eb
commit e54710bd72
2 changed files with 34 additions and 15 deletions

View File

@ -1,7 +1,9 @@
# A CallTip window class for Tkinter/IDLE.
# After ToolTip.py, which uses ideas gleaned from PySol
"""A CallTip window class for Tkinter/IDLE.
# Used by the CallTips IDLE extension.
After ToolTip.py, which uses ideas gleaned from PySol
Used by the CallTips IDLE extension.
"""
from Tkinter import *
class CallTip:
@ -13,13 +15,11 @@ class CallTip:
self.x = self.y = 0
def showtip(self, text):
# SF bug 546078: IDLE calltips cause application error.
# There were crashes on various Windows flavors, and even a
# crashing X server on Linux, with very long calltips.
" Display text in calltip window"
# truncate overly long calltip
if len(text) >= 79:
text = text[:75] + ' ...'
self.text = text
if self.tipwindow or not self.text:
return
self.widget.see("insert")
@ -27,6 +27,10 @@ class CallTip:
x = x + self.widget.winfo_rootx() + 2
y = y + cy + self.widget.winfo_rooty()
self.tipwindow = tw = Toplevel(self.widget)
# XXX 12 Dec 2002 KBK The following command has two effects: It removes
# the calltip window border (good) but also causes (at least on
# Linux) the calltip to show as a top level window, burning through
# any other window dragged over it. Also, shows on all viewports!
tw.wm_overrideredirect(1)
tw.wm_geometry("+%d+%d" % (x, y))
try:
@ -68,7 +72,7 @@ class container: # Conceptually an editor_window
text.bind("<<calltip-hide>>", self.calltip_hide)
text.focus_set()
# root.mainloop() # not in idle
root.mainloop()
def calltip_show(self, event):
self.calltip.showtip("Hello world")

View File

@ -1,9 +1,10 @@
"""CallTips.py - An IDLE Extension to Jog Your Memory
Call Tips are floating windows which display function/method parameter
information as you open the parameter parenthesis, and which disappear when you
type the closing parenthesis. Future plans include extending the functionality
to include class attributes.
Call Tips are floating windows which display function, class, and method
parameter and docstring information when you type an opening parenthesis, and
which disappear when you type a closing parenthesis.
Future plans include extending the functionality to include class attributes.
"""
import sys
@ -82,8 +83,21 @@ class CallTips:
return str[i:]
def fetch_tip(self, name):
interp = self.editwin and self.editwin.flist.pyshell.interp
rpcclt = interp and interp.rpcclt
"""Return the argument list and docstring of a function or class
If there is a Python subprocess, get the calltip there. Otherwise,
either fetch_tip() is running in the subprocess itself or it was called
in an IDLE EditorWindow before any script had been run.
The subprocess environment is that of the most recently run script. If
two unrelated modules are being edited some calltips in the current
module may be inoperative if the module was not the last to run.
"""
try:
rpcclt = self.editwin.flist.pyshell.interp.rpcclt
except:
rpcclt = None
if rpcclt:
return rpcclt.remotecall("exec", "get_the_calltip",
(name,), {})
@ -92,6 +106,7 @@ class CallTips:
return get_arg_text(entity)
def get_entity(self, name):
"Lookup name in a namespace spanning sys.modules and __main.dict__"
if name:
namespace = sys.modules.copy()
namespace.update(__main__.__dict__)
@ -112,7 +127,7 @@ def _find_constructor(class_ob):
return None
def get_arg_text(ob):
# Get a string describing the arguments for the given object.
"Get a string describing the arguments for the given object"
argText = ""
if ob is not None:
argOffset = 0