Ich benutze das Notebook von tkinter
.
Und ich muss eine Registerkarte schließen, wenn ich einen Rechtsklick darauf mache.
Aber ich kann keinen Weg finden, irgendein Ereignis darauf zu behandeln. Also ich hoffe, dass mir jemand helfen kann. Ich brauche nur ein Beispiel, also wenn Sie irgendetwas (Code, etc) fragen, fragen Sie mich.Ist es möglich, ein Mausereignis an eine Registerkarte eines Notebooks zu binden?
0
A
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.
Verwandte Themen
- 1. Ist es möglich, WPF Combobox.SelectedValue an mehrere ObjectDataProvider zu binden?
- 2. Ist es möglich, eine Domäne an eine andere Domäne anstatt an eine Server-IP zu binden?
- 3. Ist es möglich, RelativeLayout-Einschränkungen zu binden?
- 4. Ist es möglich, ein WPF-Steuerelement an mehrere Datenkontexte zu binden?
- 5. Ist es möglich, eine Eigenschaft im Code "x: Binden"?
- 6. Ist es möglich, eine Verknüpfung zu einer Schaltfläche/Funktion eines Office-Add-Ins zu binden?
- 7. Ist es möglich, einen Parameter an ein (unäres) Proc-Objekt zu binden?
- 8. Binden eines Xpage DominoDocument an eine Bean
- 9. Ist es möglich, einen Befehl direkt an eine App-Leiste zu binden?
- 10. In WPF/Silverlight ist es möglich, an ein HTML-ähnliches TableControl zu binden?
- 11. Ist es möglich, CommitEditCommand für ein Datagrid an einen ICommand im Ansichtsmodell zu binden?
- 12. Ist es möglich, Daten an eine Methode in Silverlight zu binden?
- 13. Selen an eine bestimmte IP binden - Möglich?
- 14. Ist es möglich, in Xcode ein Symbol in eine neue Registerkarte zu klicken?
- 15. Es ist nicht möglich, JSON-Daten mit angularjs an eine Tabelle zu binden
- 16. Ist es möglich, an eine private Variable gebundene Eigenschaft zu binden?
- 17. An eine Datenvorlagensteuerungseigenschaft binden
- 18. Ist es möglich, die Aktionsbalken-Registerkarte programmgesteuert zu ändern?
- 19. Gibt es eine Möglichkeit, das Schicksal eines Threads an ein Objekt zu binden?
- 20. C# Ist es möglich, mehrere Optionen zu binden?
- 21. Ist es möglich, die Schriftfarbe einer TTabSheet-Registerkarte zu ändern?
- 22. Ist es möglich, kendo Gitter dataItem auf Zellebene zu binden
- 23. Ist es möglich OpenCV GpuMat als OpenGL Textur zu binden?
- 24. Ist es möglich, OneNote zu ZIM
- 25. Binden eines Typeconverter direkt an eine Enumeration
- 26. Binden eines WPF DataGrid an eine DataTable
- 27. Eine Zeichenfolge an ein Textfeld binden
- 28. In WPF/Silverlight: Ist es möglich, eine DataTable oder eine XML-Datei an eine ListView zu binden?
- 29. Binden eines GridView-Steuerelements an eine DataTable
- 30. Eckig: ist es möglich, den Wert eines Attributes zu anderem HTML-Attribute zu binden
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?? –
@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
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. –