| 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() |