tkinter treeview widget - bind doubleclick to items only ?

MRAB python at mrabarnett.plus.com
Mon Jan 20 15:17:50 EST 2020


On 2020-01-20 10:49, R.Wieser wrote:
> Hello all,
> 
> I've create a treeview, and would (ofcourse) want to register some
> mouse-clicking on it, and for that I've found the ".bind()" method.
> 
> https://stackoverflow.com/questions/3794268/command-for-clicking-on-the-items-of-a-tkinter-treeview-widget
> 
> There is a slight problem with it though: when I click a columns caption
> (for sorting) the events code also gets fired, which causes problems.
> 
> I've found that I can connect mouse-click events to the column captions  as
> shown in the second example here in the "self.tree.heading()" call :
> 
> https://stackoverflow.com/questions/5286093/display-listbox-with-columns-using-tkinter
> 
> I was wondering if something similar is maybe also available for the items
> below it ...
> 
> If not, how do I ignore mouseclicks that are not done on one of the items ?
> 
You set the event handler for the column headings separately from that 
for the items.

Here's an example:
--8<----

#!python3.8
# -*- coding: utf-8 -*-
import tkinter as tk
import tkinter.ttk as ttk

class App(tk.Tk):
     def __init__(self):
         tk.Tk.__init__(self)
         self.title('Treeview Example')

         self.treeview = ttk.Treeview(self, columns=['#1'],
           displaycolumns='#all', show=['headings'])
         self.treeview.heading('#1', text='Items', command=lambda iid='#1':
           self.on_heading(iid))
         self.treeview.bind('<Double-1>', self.on_dclick)
         self.treeview.pack(fill='both', expand=True)

         for i in range(5):
             iid = self.treeview.insert('', 'end')
             self.treeview.set(iid, '#1', 'Item %d' % (1 + i))

     def on_heading(self, iid):
         print('Clicked on column %s' % iid, flush=True)
         selection = self.treeview.selection()
         print('Selection is %s' % ascii(selection), flush=True)

     def on_dclick(self, event):
         print('Double-clicked on an item', flush=True)
         selection = self.treeview.selection()
         print('Selection is %s' % ascii(selection), flush=True)

App().mainloop()

--8<----

If you click on the column heading you get:

Clicked on column #1
Selection is ...

If you double-click on, say, item 1, you get:

Double-clicked on an item
Selection is ('I001',)


More information about the Python-list mailing list