diff options
author | Guido van Rossum <guido@python.org> | 1999-01-11 14:45:11 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1999-01-11 14:45:11 (GMT) |
commit | d5f038098a0daf1e9b458c1a7386f97f461a86cc (patch) | |
tree | ddc500e691f97bb529cd730720a170cd286d5581 | |
parent | 031d0e5feb208e79cf1634db7d9d17148be7ba10 (diff) | |
download | cpython-d5f038098a0daf1e9b458c1a7386f97f461a86cc.zip cpython-d5f038098a0daf1e9b458c1a7386f97f461a86cc.tar.gz cpython-d5f038098a0daf1e9b458c1a7386f97f461a86cc.tar.bz2 |
Separator classes (draggable divider between two panes).
-rw-r--r-- | Tools/idle/Separator.py | 89 |
1 files changed, 89 insertions, 0 deletions
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() |