| 
									
										
										
										
											1999-06-02 16:10:19 +00:00
										 |  |  | # A CallTip window class for Tkinter/IDLE. | 
					
						
							|  |  |  | # After ToolTip.py, which uses ideas gleaned from PySol | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Used by the CallTips IDLE extension. | 
					
						
							|  |  |  | from Tkinter import * | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CallTip: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, widget): | 
					
						
							|  |  |  |         self.widget = widget | 
					
						
							|  |  |  |         self.tipwindow = None | 
					
						
							|  |  |  |         self.id = None | 
					
						
							|  |  |  |         self.x = self.y = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def showtip(self, text): | 
					
						
							| 
									
										
										
										
											2002-04-22 18:43:49 +00:00
										 |  |  |         # 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. | 
					
						
							|  |  |  |         if len(text) >= 79: | 
					
						
							|  |  |  |             text = text[:75] + ' ...' | 
					
						
							| 
									
										
										
										
											1999-06-02 16:10:19 +00:00
										 |  |  |         self.text = text | 
					
						
							| 
									
										
										
										
											2002-04-22 18:43:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-02 16:10:19 +00:00
										 |  |  |         if self.tipwindow or not self.text: | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         self.widget.see("insert") | 
					
						
							|  |  |  |         x, y, cx, cy = self.widget.bbox("insert") | 
					
						
							|  |  |  |         x = x + self.widget.winfo_rootx() + 2 | 
					
						
							|  |  |  |         y = y + cy + self.widget.winfo_rooty() | 
					
						
							|  |  |  |         self.tipwindow = tw = Toplevel(self.widget) | 
					
						
							|  |  |  |         tw.wm_overrideredirect(1) | 
					
						
							|  |  |  |         tw.wm_geometry("+%d+%d" % (x, y)) | 
					
						
							|  |  |  |         label = Label(tw, text=self.text, justify=LEFT, | 
					
						
							| 
									
										
										
										
											1999-06-10 14:19:46 +00:00
										 |  |  |                       background="#ffffe0", relief=SOLID, borderwidth=1, | 
					
						
							|  |  |  |                       font = self.widget['font']) | 
					
						
							| 
									
										
										
										
											1999-06-02 16:10:19 +00:00
										 |  |  |         label.pack() | 
					
						
							| 
									
										
										
										
											2001-01-17 08:48:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-02 16:10:19 +00:00
										 |  |  |     def hidetip(self): | 
					
						
							|  |  |  |         tw = self.tipwindow | 
					
						
							|  |  |  |         self.tipwindow = None | 
					
						
							|  |  |  |         if tw: | 
					
						
							|  |  |  |             tw.destroy() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ############################### | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Test Code | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | class container: # Conceptually an editor_window | 
					
						
							|  |  |  |     def __init__(self): | 
					
						
							|  |  |  |         root = Tk() | 
					
						
							|  |  |  |         text = self.text = Text(root) | 
					
						
							|  |  |  |         text.pack(side=LEFT, fill=BOTH, expand=1) | 
					
						
							|  |  |  |         text.insert("insert", "string.split") | 
					
						
							|  |  |  |         root.update() | 
					
						
							|  |  |  |         self.calltip = CallTip(text) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         text.event_add("<<calltip-show>>", "(") | 
					
						
							|  |  |  |         text.event_add("<<calltip-hide>>", ")") | 
					
						
							|  |  |  |         text.bind("<<calltip-show>>", self.calltip_show) | 
					
						
							|  |  |  |         text.bind("<<calltip-hide>>", self.calltip_hide) | 
					
						
							| 
									
										
										
										
											2001-01-17 08:48:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-02 16:10:19 +00:00
										 |  |  |         text.focus_set() | 
					
						
							|  |  |  |         # root.mainloop() # not in idle | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def calltip_show(self, event): | 
					
						
							|  |  |  |         self.calltip.showtip("Hello world") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def calltip_hide(self, event): | 
					
						
							|  |  |  |         self.calltip.hidetip() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							|  |  |  |     # Test code | 
					
						
							|  |  |  |     c=container() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__=='__main__': | 
					
						
							|  |  |  |     main() |