Reputation: 76945
I'm creating a GUI with Tkinter, and a major part of the GUI is two Treeview objects. I need the contents of the Treeview
objects to change when an item (i.e. a directory) is clicked twice.
If Treeview items were buttons, I'd just be able to set command
to the appropriate function. But I'm having trouble finding a way to create "on_click"
behavior for Treeview items.
What Treeview option, method, etc, enables me to bind a command to particular items and execute that command "on_click"
?
Upvotes: 26
Views: 62987
Reputation: 133
I was having a similar functionality on a Treeview and overcome the issue with row selection on click by binding the event to be on click release. As you will have to release your click eventually :P my code looks like something below:
from tkinter import *
from tkinter import ttk
<codehere>
TreeView.bind('<Double-1>', function1) # If you want bind function1 on double click
TreeView.bind('<ButtonRelease-1>', myfunction2) # If you want bind function2 on single click (on release click)
Upvotes: 0
Reputation: 121
I know this is old but this code will also print multiple selected item in a treeview.
def on_double_click(self, event):
item = self.tree.selection()
for i in item:
print("you clicked on", self.tree.item(i, "values")[0])
Upvotes: 4
Reputation: 385830
If you want something to happen when the user double-clicks, add a binding to "<Double-1>"
. Since a single click sets the selection, in your callback you can query the widget to find out what is selected. For example:
import tkinter as tk
from tkinter import ttk
class App:
def __init__(self):
self.root = tk.Tk()
self.tree = ttk.Treeview()
self.tree.pack()
for i in range(10):
self.tree.insert("", "end", text="Item %s" % i)
self.tree.bind("<Double-1>", self.OnDoubleClick)
self.root.mainloop()
def OnDoubleClick(self, event):
item = self.tree.selection()[0]
print("you clicked on", self.tree.item(item,"text"))
if __name__ == "__main__":
app = App()
Upvotes: 48
Reputation: 261
The previous solution fails when multiple elements are selected and the user uses SHIFT+CLICK
(at least on a Mac).
Here is a better solution:
import tkinter as tk
import tkinter.ttk as ttk
class App:
def __init__(self):
self.root = tk.Tk()
self.tree = ttk.Treeview()
self.tree.pack()
for i in range(10):
self.tree.insert("", "end", text="Item %s" % i)
self.tree.bind("<Double-1>", self.OnDoubleClick)
self.root.mainloop()
def OnDoubleClick(self, event):
item = self.tree.identify('item',event.x,event.y)
print("you clicked on", self.tree.item(item,"text"))
if __name__ == "__main__":
app = App()
Upvotes: 26