Как заставить вкладку ttk.Notebook генерировать события как при входе, так и при выходе? - PullRequest
0 голосов
/ 28 мая 2019

Мне нужна вкладка для чтения некоторых данных из ttk.Notebook (или объекта / списка / dict / любого другого изменяемого файла, переданного в ttk.Notebook) при отображении и записи данных обратно, когда они ушли.Вот мой пример

class TestTabs():
    class ManagerNotebook(ttk.Notebook):
        def __init__(self, master):
            ttk.Notebook.__init__(self, master)
            self.bind("<<NotebookTabChanged>>", self.onTabChange)
            self.visit_str = 'viewed'
            self.leave_str = 'left'
            self.prev_id = [None] #mutable list

        def onTabChange(self, event):
            current_id = [event.widget.index("current")]
            event.widget.winfo_children()[current_id[0]].onVisibleIn(self, current_id[0], self.visit_str)
            if self.prev_id[0] is not None:
                event.widget.winfo_children()[self.prev_id[0]].onVisibleOut(self, self.prev_id[0], self.leave_str)
            self.prev_id[0] = current_id[0]

    class DispatcherTab(ttk.Frame):
        def __init__(self, parent):
            self.parent = parent
            ttk.Frame.__init__(self, parent)
            Label(self, text='Sample text').pack()

        def onVisibleIn(self, parent, id, str):
            print('%s is %s' % (parent.tab(id, 'text'), str))

        def onVisibleOut(self, parent, id, str):
            print('%s is %s' % (parent.tab(id, 'text'), str))

    def __init__(self,root):
        self.tabControl = self.ManagerNotebook(root)
        self.mainTab = self.DispatcherTab(self.tabControl)
        self.tabControl.add(self.mainTab, text='First tab')
        self.nextTab = self.DispatcherTab(self.tabControl)
        self.tabControl.add(self.nextTab, text='Second tab')
        self.tabControl.pack(fill="both", expand=True)

def main():
    tk_root = Tk()
    test_gui = TestTabs(tk_root)
    tk_root.mainloop()


if __name__ == '__main__':
    main()

Есть ли более простой способ сделать то, что я хочу?

...