Separator classes (draggable divider between two panes).
diff --git a/Tools/idle/Separator.py b/Tools/idle/Separator.py
new file mode 100644
index 0000000..26cdf6c
--- /dev/null
+++ b/Tools/idle/Separator.py
@@ -0,0 +1,89 @@
+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)
+
+ 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>")
+
+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...")
+
+if __name__ == '__main__':
+ main()