| 
									
										
										
										
											1999-01-11 14:45:11 +00:00
										 |  |  | from Tkinter import * | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Separator: | 
					
						
							| 
									
										
										
										
											2001-01-17 08:48:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-01-11 14:45:11 +00:00
										 |  |  |     def __init__(self, master, orient, min=10, thickness=5, bg=None): | 
					
						
							|  |  |  |         self.min = max(1, min) | 
					
						
							|  |  |  |         self.thickness = max(1, thickness) | 
					
						
							|  |  |  |         if orient in ("h", "horizontal"): | 
					
						
							|  |  |  |             self.side = "left" | 
					
						
							|  |  |  |             self.dim = "width" | 
					
						
							|  |  |  |             self.dir = "x" | 
					
						
							|  |  |  |             self.cursor = "sb_h_double_arrow" | 
					
						
							| 
									
										
										
										
											2001-01-17 08:48:39 +00:00
										 |  |  |         elif orient in ("v", "vertical"): | 
					
						
							|  |  |  |             self.side = "top" | 
					
						
							|  |  |  |             self.dim = "height" | 
					
						
							|  |  |  |             self.dir = "y" | 
					
						
							| 
									
										
										
										
											1999-01-11 14:45:11 +00:00
										 |  |  |             self.cursor = "sb_v_double_arrow" | 
					
						
							| 
									
										
										
										
											2001-01-17 08:48:39 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             raise ValueError, "Separator: orient should be h or v" | 
					
						
							|  |  |  |         self.winfo_dim = "winfo_" + self.dim | 
					
						
							| 
									
										
										
										
											1999-01-11 14:45:11 +00:00
										 |  |  |         self.master = master = Frame(master) | 
					
						
							|  |  |  |         master.pack(expand=1, fill="both") | 
					
						
							|  |  |  |         self.f1 = Frame(master) | 
					
						
							|  |  |  |         self.f1.pack(expand=1, fill="both", side=self.side) | 
					
						
							|  |  |  |         self.div = Frame(master, cursor=self.cursor) | 
					
						
							|  |  |  |         self.div[self.dim] = self.thickness | 
					
						
							|  |  |  |         self.div.pack(fill="both", side=self.side) | 
					
						
							|  |  |  |         self.f2 = Frame(master) | 
					
						
							|  |  |  |         self.f2.pack(expand=1, fill="both", side=self.side) | 
					
						
							|  |  |  |         self.div.bind("<ButtonPress-1>", self.divider_press) | 
					
						
							|  |  |  |         if bg: | 
					
						
							|  |  |  |             ##self.f1["bg"] = bg | 
					
						
							|  |  |  |             ##self.f2["bg"] = bg | 
					
						
							|  |  |  |             self.div["bg"] = bg | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def parts(self): | 
					
						
							|  |  |  |         return self.f1, self.f2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def divider_press(self, event): | 
					
						
							|  |  |  |         self.press_event = event | 
					
						
							|  |  |  |         self.f1.pack_propagate(0) | 
					
						
							|  |  |  |         self.f2.pack_propagate(0) | 
					
						
							|  |  |  |         for f in self.f1, self.f2: | 
					
						
							|  |  |  |             for dim in "width", "height": | 
					
						
							|  |  |  |                 f[dim] = getattr(f, "winfo_"+dim)() | 
					
						
							|  |  |  |         self.div.bind("<Motion>", self.div_motion) | 
					
						
							|  |  |  |         self.div.bind("<ButtonRelease-1>", self.div_release) | 
					
						
							| 
									
										
										
										
											1999-01-12 22:09:18 +00:00
										 |  |  |         self.div.grab_set() | 
					
						
							| 
									
										
										
										
											1999-01-11 14:45:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def div_motion(self, event): | 
					
						
							|  |  |  |         delta = getattr(event, self.dir) - getattr(self.press_event, self.dir) | 
					
						
							|  |  |  |         if delta: | 
					
						
							|  |  |  |             dim1 = getattr(self.f1, self.winfo_dim)() | 
					
						
							|  |  |  |             dim2 = getattr(self.f2, self.winfo_dim)() | 
					
						
							|  |  |  |             delta = max(delta, self.min-dim1) | 
					
						
							|  |  |  |             delta = min(delta, dim2-self.min) | 
					
						
							|  |  |  |             dim1 = dim1 + delta | 
					
						
							|  |  |  |             dim2 = dim2 - delta | 
					
						
							|  |  |  |             self.f1[self.dim] = dim1 | 
					
						
							|  |  |  |             self.f2[self.dim] = dim2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def div_release(self, event): | 
					
						
							|  |  |  |         self.div_motion(event) | 
					
						
							|  |  |  |         self.div.unbind("<Motion>") | 
					
						
							| 
									
										
										
										
											1999-01-12 22:09:18 +00:00
										 |  |  |         self.div.grab_release() | 
					
						
							| 
									
										
										
										
											1999-01-11 14:45:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class VSeparator(Separator): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, master, min=10, thickness=5, bg=None): | 
					
						
							|  |  |  |         Separator.__init__(self, master, "v", min, thickness, bg) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class HSeparator(Separator): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, master, min=10, thickness=5, bg=None): | 
					
						
							|  |  |  |         Separator.__init__(self, master, "h", min, thickness, bg) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							|  |  |  |     root = Tk() | 
					
						
							|  |  |  |     tlist = [] | 
					
						
							|  |  |  |     outer = HSeparator(root, bg="red") | 
					
						
							|  |  |  |     for part in outer.parts(): | 
					
						
							|  |  |  |         inner = VSeparator(part, bg="blue") | 
					
						
							|  |  |  |         for f in inner.parts(): | 
					
						
							|  |  |  |             t = Text(f, width=40, height=10, borderwidth=0) | 
					
						
							|  |  |  |             t.pack(fill="both", expand=1) | 
					
						
							|  |  |  |             tlist.append(t) | 
					
						
							|  |  |  |     tlist[0].insert("1.0", "Make your own Mondrian!") | 
					
						
							|  |  |  |     tlist[1].insert("1.0", "Move the colored dividers...") | 
					
						
							| 
									
										
										
										
											1999-01-12 22:09:18 +00:00
										 |  |  |     root.mainloop() | 
					
						
							| 
									
										
										
										
											1999-01-11 14:45:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     main() |