Oct-18-2021, 09:03 AM
(Oct-17-2021, 04:41 PM)CyKlop Wrote: The purpose of BindableList is to keep a tkinter.ttk.Treeview synchronized with the various lists, even if the list is modified directly by someone else (i.e. a variation on the observer design pattern).
I made an example, but without binding events. If you want to copy the behavior of a list, don't use a list.
Instead you can inherit your class from collections.UserList and work with tkinter.ttk.TreeView as composition.
The problem is, that list (UserList) and TreeView do have methods with equal names.
Here the demo code:
import operator import random import time from collections import UserList from tkinter import END, Tk from tkinter.ttk import Treeview class ListTreeView(UserList): def __init__(self, master=None, columns=None): super().__init__() self.master = master self.treeview = Treeview(master, columns=columns, show="headings") def append(self, data): super().append(data) self.treeview.insert("", END, values=data) def extend(self, iterable): super().extend(iterable) for item in iterable: self.treeview.insert("", END, values=item) def remove(self, item): index = self.index(item) del self[index] selector = operator.itemgetter(index) children = self.treeview.get_children() self.treeview.delete(selector(children)) def grid(self, *args, **kwargs): return self.treeview.grid(*args, **kwargs) def pack(self, *args, **kwargs): return self.treeview.pack(*args, **kwargs) def __delitem__(self, index): treeview_index = self.treeview.get_children() super().__delitem__(index) self.treeview.delete(treeview_index[index]) if __name__ == "__main__": root = Tk() tv = ListTreeView(root, ["index", "random"]) tv.pack() for index in range(100, 106): time.sleep(0.2) tv.append([index, random.randint(0, 100)]) root.update() # delete last time.sleep(2) del tv[-1] root.update() # delete first time.sleep(1) del tv[0] root.update() time.sleep(1) root.destroy()
Almost dead, but too lazy to die: https://sourceserver.info
All humans together. We don't need politicians!
All humans together. We don't need politicians!