Tkinter ttk Treeview binding responds to past events!

John O'Hagan research at johnohagan.com
Tue Sep 12 21:50:18 EDT 2023


On Wed, 2023-09-13 at 01:33 +0100, MRAB via Python-list wrote:
> On 2023-09-13 00:40, John O'Hagan via Python-list wrote:
> > On Tue, 2023-09-12 at 20:51 +0200, Mirko via Python-list wrote:
> > > Am 12.09.23 um 07:43 schrieb John O'Hagan via Python-list:
> > > 

[...]


> > 
> > 
> > > FWIW, here's a version without after(), solving this purely on
> > > the 
> > > python side, not by temporarily unbinding the event, but by 
> > > selectively doing nothing in the callback function.
> > > 
> > > from tkinter import *
> > > from tkinter.ttk import *
> > > 
> > > class Test:
> > >      def __init__(self):
> > >          self.inhibit = False
> > >          root=Tk()
> > >          self.tree = Treeview(root)
> > >          self.tree.pack()
> > >          self.iid = self.tree.insert('', 0, text='test')
> > >          Button(root, command=self.temp_inhibit).pack()
> > >          mainloop()
> > > 
> > >      def callback(self, *e):
> > >          if not self.inhibit:
> > >              print('called')
> > > 
> > >      def temp_inhibit(self):
> > >          self.inhibit = True
> > >          self.tree.selection_set(self.iid)
> > >          self.tree.selection_remove(self.iid)
> > >          self.tree.selection_set(self.iid)
> > >          self.inhibit = False
> > >          self.callback()
> > > 
> > > c=Test()
> > > 
> > 
> > 
> > I like this solution better - it's much more obvious to me what
> > it's
> > doing.
> > 
> That code is not binding at all, it's just calling 'temp_inhibit'
> when 
> the button is clicked.
> 
> You can remove all uses of self.inhibit and rename 'temp_inhibit' to 
> something more meaningful, like 'delete_item'.

You're right of course, not as obvious as I thought!



More information about the Python-list mailing list