mirror of https://github.com/python/cpython
90 lines
3.0 KiB
Python
90 lines
3.0 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)
|
||
|
|
||
|
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()
|