| 
									
										
										
										
											2008-05-17 18:39:55 +00:00
										 |  |  | from tkinter import * | 
					
						
							| 
									
										
										
										
											2019-01-02 22:04:06 -05:00
										 |  |  | from tkinter.ttk import Frame, Scrollbar | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-31 00:50:55 -04:00
										 |  |  | from idlelib import macosx | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | class ScrolledList: | 
					
						
							| 
									
										
										
										
											2001-07-14 01:23:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |     default = "(None)" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, master, **options): | 
					
						
							|  |  |  |         # Create top frame, with scrollbar and listbox | 
					
						
							|  |  |  |         self.master = master | 
					
						
							|  |  |  |         self.frame = frame = Frame(master) | 
					
						
							|  |  |  |         self.frame.pack(fill="both", expand=1) | 
					
						
							|  |  |  |         self.vbar = vbar = Scrollbar(frame, name="vbar") | 
					
						
							|  |  |  |         self.vbar.pack(side="right", fill="y") | 
					
						
							|  |  |  |         self.listbox = listbox = Listbox(frame, exportselection=0, | 
					
						
							|  |  |  |             background="white") | 
					
						
							|  |  |  |         if options: | 
					
						
							|  |  |  |             listbox.configure(options) | 
					
						
							|  |  |  |         listbox.pack(expand=1, fill="both") | 
					
						
							|  |  |  |         # Tie listbox and scrollbar together | 
					
						
							|  |  |  |         vbar["command"] = listbox.yview | 
					
						
							|  |  |  |         listbox["yscrollcommand"] = vbar.set | 
					
						
							|  |  |  |         # Bind events to the list box | 
					
						
							|  |  |  |         listbox.bind("<ButtonRelease-1>", self.click_event) | 
					
						
							|  |  |  |         listbox.bind("<Double-ButtonRelease-1>", self.double_click_event) | 
					
						
							| 
									
										
										
										
											2016-05-28 13:22:31 -04:00
										 |  |  |         if macosx.isAquaTk(): | 
					
						
							| 
									
										
										
										
											2015-09-26 18:50:26 -04:00
										 |  |  |             listbox.bind("<ButtonPress-2>", self.popup_event) | 
					
						
							|  |  |  |             listbox.bind("<Control-Button-1>", self.popup_event) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             listbox.bind("<ButtonPress-3>", self.popup_event) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         listbox.bind("<Key-Up>", self.up_event) | 
					
						
							|  |  |  |         listbox.bind("<Key-Down>", self.down_event) | 
					
						
							|  |  |  |         # Mark as empty | 
					
						
							|  |  |  |         self.clear() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def close(self): | 
					
						
							|  |  |  |         self.frame.destroy() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def clear(self): | 
					
						
							|  |  |  |         self.listbox.delete(0, "end") | 
					
						
							|  |  |  |         self.empty = 1 | 
					
						
							|  |  |  |         self.listbox.insert("end", self.default) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def append(self, item): | 
					
						
							|  |  |  |         if self.empty: | 
					
						
							|  |  |  |             self.listbox.delete(0, "end") | 
					
						
							|  |  |  |             self.empty = 0 | 
					
						
							|  |  |  |         self.listbox.insert("end", str(item)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get(self, index): | 
					
						
							|  |  |  |         return self.listbox.get(index) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def click_event(self, event): | 
					
						
							|  |  |  |         self.listbox.activate("@%d,%d" % (event.x, event.y)) | 
					
						
							|  |  |  |         index = self.listbox.index("active") | 
					
						
							|  |  |  |         self.select(index) | 
					
						
							|  |  |  |         self.on_select(index) | 
					
						
							|  |  |  |         return "break" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def double_click_event(self, event): | 
					
						
							|  |  |  |         index = self.listbox.index("active") | 
					
						
							|  |  |  |         self.select(index) | 
					
						
							|  |  |  |         self.on_double(index) | 
					
						
							|  |  |  |         return "break" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     menu = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def popup_event(self, event): | 
					
						
							|  |  |  |         if not self.menu: | 
					
						
							|  |  |  |             self.make_menu() | 
					
						
							|  |  |  |         menu = self.menu | 
					
						
							|  |  |  |         self.listbox.activate("@%d,%d" % (event.x, event.y)) | 
					
						
							|  |  |  |         index = self.listbox.index("active") | 
					
						
							|  |  |  |         self.select(index) | 
					
						
							|  |  |  |         menu.tk_popup(event.x_root, event.y_root) | 
					
						
							| 
									
										
										
										
											2017-06-27 07:02:32 +03:00
										 |  |  |         return "break" | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def make_menu(self): | 
					
						
							|  |  |  |         menu = Menu(self.listbox, tearoff=0) | 
					
						
							|  |  |  |         self.menu = menu | 
					
						
							|  |  |  |         self.fill_menu() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def up_event(self, event): | 
					
						
							|  |  |  |         index = self.listbox.index("active") | 
					
						
							|  |  |  |         if self.listbox.selection_includes(index): | 
					
						
							|  |  |  |             index = index - 1 | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             index = self.listbox.size() - 1 | 
					
						
							|  |  |  |         if index < 0: | 
					
						
							|  |  |  |             self.listbox.bell() | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.select(index) | 
					
						
							|  |  |  |             self.on_select(index) | 
					
						
							|  |  |  |         return "break" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def down_event(self, event): | 
					
						
							|  |  |  |         index = self.listbox.index("active") | 
					
						
							|  |  |  |         if self.listbox.selection_includes(index): | 
					
						
							|  |  |  |             index = index + 1 | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             index = 0 | 
					
						
							|  |  |  |         if index >= self.listbox.size(): | 
					
						
							|  |  |  |             self.listbox.bell() | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.select(index) | 
					
						
							|  |  |  |             self.on_select(index) | 
					
						
							|  |  |  |         return "break" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def select(self, index): | 
					
						
							|  |  |  |         self.listbox.focus_set() | 
					
						
							|  |  |  |         self.listbox.activate(index) | 
					
						
							|  |  |  |         self.listbox.selection_clear(0, "end") | 
					
						
							|  |  |  |         self.listbox.selection_set(index) | 
					
						
							|  |  |  |         self.listbox.see(index) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Methods to override for specific actions | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def fill_menu(self): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def on_select(self, index): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def on_double(self, index): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 18:19:21 -04:00
										 |  |  | def _scrolled_list(parent):  # htest # | 
					
						
							|  |  |  |     top = Toplevel(parent) | 
					
						
							| 
									
										
										
										
											2016-07-10 17:28:10 -04:00
										 |  |  |     x, y = map(int, parent.geometry().split('+')[1:]) | 
					
						
							|  |  |  |     top.geometry("+%d+%d" % (x+200, y + 175)) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |     class MyScrolledList(ScrolledList): | 
					
						
							| 
									
										
										
										
											2014-05-24 18:48:18 -04:00
										 |  |  |         def fill_menu(self): self.menu.add_command(label="right click") | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |         def on_select(self, index): print("select", self.get(index)) | 
					
						
							|  |  |  |         def on_double(self, index): print("double", self.get(index)) | 
					
						
							| 
									
										
										
										
											2014-05-24 18:48:18 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 18:19:21 -04:00
										 |  |  |     scrolled_list = MyScrolledList(top) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |     for i in range(30): | 
					
						
							| 
									
										
										
										
											2014-05-24 18:48:18 -04:00
										 |  |  |         scrolled_list.append("Item %02d" % i) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2018-06-19 19:12:52 -04:00
										 |  |  |     from unittest import main | 
					
						
							|  |  |  |     main('idlelib.idle_test.test_scrolledlist', verbosity=2,) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-24 18:48:18 -04:00
										 |  |  |     from idlelib.idle_test.htest import run | 
					
						
							|  |  |  |     run(_scrolled_list) |