mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
	
	
		
			93 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			93 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | from Tkinter import * | ||
|  | 
 | ||
|  | class Separator: | ||
|  |      | ||
|  |     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" | ||
|  |     	elif orient in ("v", "vertical"): | ||
|  |     	    self.side = "top" | ||
|  |     	    self.dim = "height" | ||
|  |     	    self.dir = "y" | ||
|  |             self.cursor = "sb_v_double_arrow" | ||
|  |     	else: | ||
|  |     	    raise ValueError, "Separator: orient should be h or v" | ||
|  |     	self.winfo_dim = "winfo_" + self.dim | ||
|  |         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) | ||
|  |         self.div.grab_set() | ||
|  | 
 | ||
|  |     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>") | ||
|  |         self.div.grab_release() | ||
|  | 
 | ||
|  | 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...") | ||
|  |     root.mainloop() | ||
|  | 
 | ||
|  | if __name__ == '__main__': | ||
|  |     main() |