2010-09-25 3 views
9

Sto creando una GUI con Tkinter e una parte importante della GUI sono due oggetti Treeview. Ho bisogno del contenuto degli oggetti Treeview su cambiare quando un elemento (ad esempio una directory) è ha fatto clic due volte su.Comando per fare clic sugli oggetti di un widget Treeview di Tkinter?

Se gli elementi Treeview erano pulsanti, sarei solo in grado di impostare command nella funzione appropriata. Ma ho difficoltà a trovare un modo per creare il comportamento di "on_click" per gli elementi di visualizzazione di anteprima.

Quale opzione Treeview, metodo, ecc. Mi consente di associare un comando a voci particolari ed eseguire tale comando "on_click"?

risposta

16

Se si desidera che qualcosa accada quando l'utente fa doppio clic, aggiungere un'associazione a "<Double-1>". Poiché un singolo clic imposta la selezione, nel richiamo è possibile interrogare il widget per scoprire cosa è selezionato. Ad esempio:

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

La soluzione precedente non riesce quando più elementi sono selezionati e l'utente utilizza SHIFT+CLICK (almeno per Mac).

Ecco una soluzione migliore:

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