2016-07-04 28 views
1

我想爲用戶提供tkinter.ttk.Notebook對象中tab選項遍歷的多個keybinds。我正在使用下面的代碼:無法在tkinter.ttk.Notebook(Python 3.5.1)中綁定<Control-bracketleft>,<Control-bracketright>

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()產生預期的行爲,允許Control-Shift-Tab和Control-Tab導航。該和綁定也產生所需的結果,允許Control-PageUp和Control-PageDown導航。

但是,第三個選項失敗。我期望並允許通過Control- [和Control-]進行導航,但他們什麼都不做。我通過檢查相應的Tk聯機幫助文件確認密鑰是正確的,而且在Python解釋器中鍵碼不會產生錯誤。

在我的理解,tkinter應該不會有任何問題綁定到相同的回調兩個事件。我在某個地方犯了什麼錯誤,還是支架鍵不受支持?謝謝!

回答

0

綁定可能沒有問題。如果你綁定到筆記本本身,那麼它必須有註冊綁定的焦點(選擇一個標籤來獲得焦點)。如果你想綁定切換筆記本選項卡無論什麼具有焦點,然後結合到頂層窗口(在本例根)

示例代碼:

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

發現問題。即使沒有發生異常,回調函數中也有問題。一旦解決了,一切都按預期工作。我感到困惑的原因是Notebook.enable_traversal()方法提供了兩組綁定:Control-Tab和Control-Shift-Tab,以及Control-PageUp和Control-PageDown。第二對綁定在tkinter.ttk中沒有記錄。 – IJKLefty