2016-07-04 2 views
1

Je souhaite fournir aux utilisateurs plusieurs raccourcis clavier pour la traversée d'onglet dans un objet tkinter.ttk.Notebook. J'utilise le code suivant:Impossible de lier <Control-bracketleft>, <Control-bracketright> dans tkinter.ttk.Notebook (Python 3.5.1)

self.notebook = ttk.Notebook(self) 
self.notebook.enable_traversal() 
self.notebook.bind('<Control-Key-Prior>', self.priorTab) 
self.notebook.bind('<Control-Key-Next>', self.nextTab) 
self.notebook.bind('<Control-bracketleft>', self.priorTab) 
self.notebook.bind('<Control-bracketright>', self.nextTab) 

enable_traversal() produit le comportement attendu, ce qui permet le contrôle-Shift-Tab et navigation Control-Tab. Les liaisons et produisent également le résultat souhaité, permettant la navigation Control-PageUp et Control-PageDown.

La troisième option échoue cependant. Je m'attendais à permettre la navigation via Control- [et Control-], mais ils ne font rien. J'ai confirmé que les keysyms sont corrects en vérifiant la page de manuel Tk appropriée, et les keysyms ne produisent pas une erreur dans l'interpréteur Python. D'après ce que je comprends, tkinter ne devrait pas avoir de problème avec deux événements liés au même rappel. Est-ce que je fais une erreur quelque part ou est-ce que les touches du support ne sont pas supportées? Merci!

Répondre

0

Il n'y a probablement aucun problème avec les liaisons. Si vous liez le bloc-notes lui-même, il doit avoir le focus pour que les liaisons soient enregistrées (sélectionnez un onglet pour obtenir le focus). Si vous voulez que les fixations pour basculer l'onglet portable, peu importe ce qui a le focus se lier ensuite à la fenêtre de niveau supérieur (dans cet exemple racine)

Exemple de code:

import tkinter as tk 
from tkinter import ttk 

def change_tab(delta): 
    print("triggered") 
    tabs = note.tabs() 
    note.select(tabs[(tabs.index(note.select()) + delta) % len(tabs)]) 

root = tk.Tk() 
root.minsize(250, 250) 

note = ttk.Notebook(root, height = 200, width = 200) 
note.pack() 
#note.enable_traversal() 

for i in range(1, 6): 
    note.add(tk.Frame(note), text = "Tab #%d" % i) 

# Note requires focus for bindings to work 
# Change to root for bindings to work anywhere in the app 
note.bind('<Control-[>', lambda e: change_tab(-1)) 
note.bind('<Control-]>', lambda e: change_tab(1)) 

root.mainloop() 
+0

trouvé le problème. Même si aucune exception n'a été soulevée, il y avait un problème dans la fonction de rappel. Une fois que cela a été réparé, tout a fonctionné comme prévu. La raison pour laquelle j'étais confus était que la méthode Notebook.enable_traversal() fournit deux ensembles de liaisons: Control-Tab et Control-Shift-Tab, ainsi que Control-PageUp et Control-PageDown. La deuxième paire de liaisons n'est pas documentée dans tkinter.ttk. – IJKLefty