2016-11-27 2 views

Antwort

3

Sie können bind() Ereignis <Button-3> (rechte Taste), um notebook mit Funktion, die tab ausgewählt wird geschlossen.

nb = ttk.Notebook(root) 
nb.bind('<Button-3>', on_click) 

Problem ist, wie tab geklickt zu erkennen, weil tkinter x sendet nur, y.

Tcl/Tk hat Funktion indentity tab x y zu konvertieren x, y-tab index. Aber tkinter hat es nicht. Sie haben Tcl Befehl aufzurufen:

clicked_tab = nb.tk.call(nb._w, "identify", "tab", x, y) 

und jetzt können Sie diesen Index Tab schließen verwenden.


Einfache Arbeitsbeispiel

import tkinter as tk 
from tkinter import ttk 

# --- functions --- 

def on_click(event): 
    print('widget:', event.widget) 
    print('x:', event.x) 
    print('y:', event.y) 

    #selected = nb.identify(event.x, event.y) 
    #print('selected:', selected) # it's not usefull 

    clicked_tab = nb.tk.call(nb._w, "identify", "tab", event.x, event.y) 
    print('clicked tab:', clicked_tab) 

    active_tab = nb.index(nb.select()) 
    print(' active tab:', active_tab) 

    if clicked_tab == active_tab: 
     nb.forget(clicked_tab) 

# --- main --- 

root = tk.Tk() 

# create notebook 
nb = ttk.Notebook(root) 
nb.pack(fill='both') 

# bind function to notebook 
nb.bind('<Button-3>', on_click)  

# add some tabs 
for char in "ABCDEF": 
    nb.add(tk.Label(nb, text=(char*15)), text=char*3) 

root.mainloop() 

Wenn Sie if clicked_tab == active_tab: dann entfernen (können Sie ähnliche Befehl indentify in ttk.py-Datei), die Sie jeden tab schließen konnte, nicht nur aktiv.

+0

Laut den Python- und tk ttk-Dokumenten funktioniert 'Notebook.forget' mit jeder 'tab_id', nicht nur einem Tab-Index. Wenn 'name' von Notebook.identify() 'und' Notebook.select() 'tab_ids sind, da sie für' Notebook.index' funktionieren müssen, scheinen die 'tk.call' und' nb. Index-Aufrufe werden nicht benötigt. Wahr?? –

+0

@TerryJanReedy auf meinem Computer 'identify()' gibt immer String 'Label' oder' Padding' zurück - aber es ist nicht Tab-ID oder Tab-Index:/Ich fand 'Identifizieren Tab' in TK-Dokumente. Es gibt den Tab-Index zurück, so dass ich 'nb.index()' brauche, um die Tab-ID ('nb.select()') in den Tab-Index zu konvertieren, um 'angeklickte Registerkarte' mit 'aktive Registerkarte' zu vergleichen. – furas

+0

Ich frage mich, ob das beabsichtigt ist. Das Dokument, so wie es ist, ist ziemlich vage. Es kam mir gerade in den Sinn, dass man ein Widget wie z. B. Notebook ableiten und nützlichere tk.call-Wrapper hinzufügen könnte. –

Verwandte Themen