2010-09-25 1 views
9

Я создаю GUI с Tkinter, и большая часть графического интерфейса - это два объекта Treeview. Мне нужно содержимое Treeview объектов до изменение, когда элемент (то есть каталог) дважды щелкнул.Команда для щелчка по элементам виджета Tkinter Treeview?

Если элементы Treeview были кнопками, я бы просто установил command в соответствующую функцию. Но у меня возникли проблемы с поиском способа создания поведения "on_click" для элементов Treeview.

Какой параметр, метод и т. Д. Позволяет мне привязать команду к определенным элементам и выполнить эту команду "on_click"?

ответ

16

Если вы хотите, чтобы что-то произошло, когда пользователь дважды щелкает, добавьте привязку к "<Double-1>". Поскольку один клик устанавливает выбор, в вашем обратном вызове вы можете запросить виджет, чтобы узнать, что выбрано. Например:

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() 
11

Предыдущее решение терпит неудачу, если выбрано несколько элементов, и пользователь использует SHIFT+CLICK (по крайней мере, на Mac).

Вот лучшее решение:

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()