Advertisement
badtrips

ScrolledList

Jul 7th, 2015
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.05 KB | None | 0 0
  1. #coding=utf-8
  2. from Tkinter import *
  3.  
  4. class ScrolledList:
  5.  
  6.     default = "(None)"
  7.  
  8.     def __init__(self, master, **options):
  9.         # Create top frame, with scrollbar and listbox
  10.         self.master = master
  11.         self.frame = frame = Frame(master)
  12.         self.frame.pack(fill="both", expand=1)
  13.         self.vbar = vbar = Scrollbar(frame, name="vbar")
  14.         self.vbar.pack(side="right", fill="y")
  15.         self.listbox = listbox = Listbox(frame, exportselection=0,
  16.             background="white")
  17.         if options:
  18.             listbox.configure(options)
  19.         listbox.pack(expand=1, fill="both")
  20.         # Tie listbox and scrollbar together
  21.         vbar["command"] = listbox.yview
  22.         listbox["yscrollcommand"] = vbar.set
  23.         # Bind events to the list box
  24.         listbox.bind("<ButtonRelease-1>", self.click_event)
  25.         listbox.bind("<Double-ButtonRelease-1>", self.double_click_event)
  26.         listbox.bind("<ButtonPress-3>", self.popup_event)
  27.         listbox.bind("<Key-Up>", self.up_event)
  28.         listbox.bind("<Key-Down>", self.down_event)
  29.         # Mark as empty
  30.         self.clear()
  31.  
  32.     def close(self):
  33.         self.frame.destroy()
  34.  
  35.     def clear(self):
  36.         self.listbox.delete(0, "end")
  37.         self.empty = 1
  38.         self.listbox.insert("end", self.default)
  39.  
  40.     def append(self, item):
  41.         if self.empty:
  42.             self.listbox.delete(0, "end")
  43.             self.empty = 0
  44.         self.listbox.insert("end", str(item))
  45.  
  46.     def get(self, index):
  47.         return self.listbox.get(index)
  48.  
  49.     def click_event(self, event):
  50.         self.listbox.activate("@%d,%d" % (event.x, event.y))
  51.         index = self.listbox.index("active")
  52.         self.select(index)
  53.         self.on_select(index)
  54.         return "break"
  55.  
  56.     def double_click_event(self, event):
  57.         index = self.listbox.index("active")
  58.         self.select(index)
  59.         self.on_double(index)
  60.         return "break"
  61.  
  62.     menu = None
  63.  
  64.     def popup_event(self, event):
  65.         if not self.menu:
  66.             self.make_menu()
  67.         menu = self.menu
  68.         self.listbox.activate("@%d,%d" % (event.x, event.y))
  69.         index = self.listbox.index("active")
  70.         self.select(index)
  71.         menu.tk_popup(event.x_root, event.y_root)
  72.  
  73.     def make_menu(self):
  74.         menu = Menu(self.listbox, tearoff=0)
  75.         self.menu = menu
  76.         self.fill_menu()
  77.  
  78.     def up_event(self, event):
  79.         index = self.listbox.index("active")
  80.         if self.listbox.selection_includes(index):
  81.             index = index - 1
  82.         else:
  83.             index = self.listbox.size() - 1
  84.         if index < 0:
  85.             self.listbox.bell()
  86.         else:
  87.             self.select(index)
  88.             self.on_select(index)
  89.         return "break"
  90.  
  91.     def down_event(self, event):
  92.         index = self.listbox.index("active")
  93.         if self.listbox.selection_includes(index):
  94.             index = index + 1
  95.         else:
  96.             index = 0
  97.         if index >= self.listbox.size():
  98.             self.listbox.bell()
  99.         else:
  100.             self.select(index)
  101.             self.on_select(index)
  102.         return "break"
  103.  
  104.     def select(self, index):
  105.         self.listbox.focus_set()
  106.         self.listbox.activate(index)
  107.         self.listbox.selection_clear(0, "end")
  108.         self.listbox.selection_set(index)
  109.         self.listbox.see(index)
  110.  
  111.     # Methods to override for specific actions
  112.  
  113.     def fill_menu(self):
  114.         pass
  115.  
  116.     def on_select(self, index):
  117.         pass
  118.  
  119.     def on_double(self, index):
  120.         pass
  121.  
  122.  
  123. def test():
  124.     root = Tk()
  125.     root.protocol("WM_DELETE_WINDOW", root.destroy)
  126.     class MyScrolledList(ScrolledList):
  127.         def fill_menu(self): self.menu.add_command(label="pass")
  128.         def on_select(self, index): print "select", self.get(index)
  129.         def on_double(self, index): print "double", self.get(index)
  130.     s = MyScrolledList(root)
  131.     for i in range(30):
  132.         s.append("item %02d" % i)
  133.     return root
  134.  
  135. def main():
  136.     root = test()
  137.     root.mainloop()
  138.  
  139. if __name__ == '__main__':
  140.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement