mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			138 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
	
		
			3.8 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.
 | |
| 
 | |
| import string
 | |
| 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()
 | 
