| 
									
										
										
										
											2002-09-14 02:56:04 +00:00
										 |  |  | # 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 | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | # Ideas gleaned from PySol | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from Tkinter import * | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ToolTipBase: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, button): | 
					
						
							|  |  |  |         self.button = button | 
					
						
							|  |  |  |         self.tipwindow = None | 
					
						
							|  |  |  |         self.id = None | 
					
						
							|  |  |  |         self.x = self.y = 0 | 
					
						
							|  |  |  |         self._id1 = self.button.bind("<Enter>", self.enter) | 
					
						
							|  |  |  |         self._id2 = self.button.bind("<Leave>", self.leave) | 
					
						
							|  |  |  |         self._id3 = self.button.bind("<ButtonPress>", self.leave) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def enter(self, event=None): | 
					
						
							|  |  |  |         self.schedule() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def leave(self, event=None): | 
					
						
							|  |  |  |         self.unschedule() | 
					
						
							|  |  |  |         self.hidetip() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def schedule(self): | 
					
						
							|  |  |  |         self.unschedule() | 
					
						
							|  |  |  |         self.id = self.button.after(1500, self.showtip) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def unschedule(self): | 
					
						
							|  |  |  |         id = self.id | 
					
						
							|  |  |  |         self.id = None | 
					
						
							|  |  |  |         if id: | 
					
						
							|  |  |  |             self.button.after_cancel(id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def showtip(self): | 
					
						
							|  |  |  |         if self.tipwindow: | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         # 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)) | 
					
						
							|  |  |  |         self.showcontents() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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) | 
					
						
							|  |  |  |         label.pack() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def hidetip(self): | 
					
						
							|  |  |  |         tw = self.tipwindow | 
					
						
							|  |  |  |         self.tipwindow = None | 
					
						
							|  |  |  |         if tw: | 
					
						
							|  |  |  |             tw.destroy() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ToolTip(ToolTipBase): | 
					
						
							|  |  |  |     def __init__(self, button, text): | 
					
						
							|  |  |  |         ToolTipBase.__init__(self, button) | 
					
						
							|  |  |  |         self.text = text | 
					
						
							|  |  |  |     def showcontents(self): | 
					
						
							|  |  |  |         ToolTipBase.showcontents(self, self.text) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ListboxToolTip(ToolTipBase): | 
					
						
							|  |  |  |     def __init__(self, button, items): | 
					
						
							|  |  |  |         ToolTipBase.__init__(self, button) | 
					
						
							|  |  |  |         self.items = items | 
					
						
							|  |  |  |     def showcontents(self): | 
					
						
							|  |  |  |         listbox = Listbox(self.tipwindow, background="#ffffe0") | 
					
						
							|  |  |  |         listbox.pack() | 
					
						
							|  |  |  |         for item in self.items: | 
					
						
							|  |  |  |             listbox.insert(END, item) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							|  |  |  |     # Test code | 
					
						
							|  |  |  |     root = Tk() | 
					
						
							|  |  |  |     b = Button(root, text="Hello", command=root.destroy) | 
					
						
							|  |  |  |     b.pack() | 
					
						
							|  |  |  |     root.update() | 
					
						
							|  |  |  |     tip = ListboxToolTip(b, ["Hello", "world"]) | 
					
						
							| 
									
										
										
										
											2005-11-23 15:12:19 +00:00
										 |  |  |     root.mainloop() | 
					
						
							| 
									
										
										
										
											2001-07-14 01:14:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-23 15:12:19 +00:00
										 |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     main() |