# general purpose 'tooltip' routines - currently unused in idlefork
# (although the 'calltips' extension is partly based on this code)
# may be useful for some purposes in (or almost in ;) the current project scope
# Ideas gleaned from PySol
def __init__(self
, button
):
self
._id
1 = self
.button
.bind("<Enter>", self
.enter
)
self
._id
2 = self
.button
.bind("<Leave>", self
.leave
)
self
._id
3 = self
.button
.bind("<ButtonPress>", self
.leave
)
def enter(self
, event
=None):
def leave(self
, event
=None):
self
.id = self
.button
.after(1500, self
.showtip
)
self
.button
.after_cancel(id)
# The tip window must be completely outside the button;
# 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 :-(
x
= self
.button
.winfo_rootx() + 20
y
= self
.button
.winfo_rooty() + self
.button
.winfo_height() + 1
self
.tipwindow
= tw
= Toplevel(self
.button
)
tw
.wm_overrideredirect(1)
tw
.wm_geometry("+%d+%d" % (x
, y
))
def showcontents(self
, text
="Your text here"):
# Override this in derived class
label
= Label(self
.tipwindow
, text
=text
, justify
=LEFT
,
background
="#ffffe0", relief
=SOLID
, borderwidth
=1)
class ToolTip(ToolTipBase
):
def __init__(self
, button
, text
):
ToolTipBase
.__init
__(self
, button
)
ToolTipBase
.showcontents(self
, self
.text
)
class ListboxToolTip(ToolTipBase
):
def __init__(self
, button
, items
):
ToolTipBase
.__init
__(self
, button
)
listbox
= Listbox(self
.tipwindow
, background
="#ffffe0")
listbox
.insert(END
, item
)
b
= Button(root
, text
="Hello", command
=root
.destroy
)
tip
= ListboxToolTip(b
, ["Hello", "world"])
# root.mainloop() # not in idle