mirror of
https://github.com/python/cpython.git
synced 2024-12-01 11:15:56 +01:00
aaab30e00c
(with one small bugfix in bgen/bgen/scantools.py) This replaces string module functions with string methods for the stuff in the Tools directory. Several uses of string.letters etc. are still remaining.
138 lines
3.7 KiB
Python
138 lines
3.7 KiB
Python
# One or more ScrolledLists with HSeparators between them.
|
|
# There is a hierarchical relationship between them:
|
|
# the right list displays the substructure of the selected item
|
|
# in the left list.
|
|
|
|
from Tkinter import *
|
|
from WindowList import ListedToplevel
|
|
from Separator import HSeparator
|
|
from ScrolledList import ScrolledList
|
|
|
|
class MultiScrolledLists:
|
|
|
|
def __init__(self, root, nlists=2):
|
|
assert nlists >= 1
|
|
self.root = root
|
|
self.nlists = nlists
|
|
self.path = []
|
|
# create top
|
|
self.top = top = ListedToplevel(root)
|
|
top.protocol("WM_DELETE_WINDOW", self.close)
|
|
top.bind("<Escape>", self.close)
|
|
self.settitle()
|
|
# create frames and separators in between
|
|
self.frames = []
|
|
self.separators = []
|
|
last = top
|
|
for i in range(nlists-1):
|
|
sepa = HSeparator(last)
|
|
self.separators.append(sepa)
|
|
frame, last = sepa.parts()
|
|
self.frames.append(frame)
|
|
self.frames.append(last)
|
|
# create labels and lists
|
|
self.labels = []
|
|
self.lists = []
|
|
for i in range(nlists):
|
|
frame = self.frames[i]
|
|
label = Label(frame, text=self.subtitle(i),
|
|
relief="groove", borderwidth=2)
|
|
label.pack(fill="x")
|
|
self.labels.append(label)
|
|
list = ScrolledList(frame, width=self.width(i),
|
|
height=self.height(i))
|
|
self.lists.append(list)
|
|
list.on_select = \
|
|
lambda index, i=i, self=self: self.on_select(index, i)
|
|
list.on_double = \
|
|
lambda index, i=i, self=self: self.on_double(index, i)
|
|
# fill leftmost list (rest get filled on demand)
|
|
self.fill(0)
|
|
# XXX one after_idle isn't enough; two are...
|
|
top.after_idle(self.call_pack_propagate_1)
|
|
|
|
def call_pack_propagate_1(self):
|
|
self.top.after_idle(self.call_pack_propagate)
|
|
|
|
def call_pack_propagate(self):
|
|
for frame in self.frames:
|
|
frame.pack_propagate(0)
|
|
|
|
def close(self, event=None):
|
|
self.top.destroy()
|
|
|
|
def settitle(self):
|
|
short = self.shorttitle()
|
|
long = self.longtitle()
|
|
if short and long:
|
|
title = short + " - " + long
|
|
elif short:
|
|
title = short
|
|
elif long:
|
|
title = long
|
|
else:
|
|
title = "Untitled"
|
|
icon = short or long or title
|
|
self.top.wm_title(title)
|
|
self.top.wm_iconname(icon)
|
|
|
|
def longtitle(self):
|
|
# override this
|
|
return "Multi Scrolled Lists"
|
|
|
|
def shorttitle(self):
|
|
# override this
|
|
return None
|
|
|
|
def width(self, i):
|
|
# override this
|
|
return 20
|
|
|
|
def height(self, i):
|
|
# override this
|
|
return 10
|
|
|
|
def subtitle(self, i):
|
|
# override this
|
|
return "Column %d" % i
|
|
|
|
def fill(self, i):
|
|
for k in range(i, self.nlists):
|
|
self.lists[k].clear()
|
|
self.labels[k].configure(text=self.subtitle(k))
|
|
list = self.lists[i]
|
|
l = self.items(i)
|
|
for s in l:
|
|
list.append(s)
|
|
|
|
def on_select(self, index, i):
|
|
item = self.lists[i].get(index)
|
|
del self.path[i:]
|
|
self.path.append(item)
|
|
if i+1 < self.nlists:
|
|
self.fill(i+1)
|
|
|
|
def items(self, i):
|
|
# override this
|
|
l = []
|
|
for k in range(10):
|
|
s = str(k)
|
|
if i > 0:
|
|
s = self.path[i-1] + "." + s
|
|
l.append(s)
|
|
return l
|
|
|
|
def on_double(self, index, i):
|
|
pass
|
|
|
|
|
|
def main():
|
|
root = Tk()
|
|
quit = Button(root, text="Exit", command=root.destroy)
|
|
quit.pack()
|
|
MultiScrolledLists(root, 4)
|
|
root.mainloop()
|
|
|
|
if __name__ == "__main__":
|
|
main()
|