2016-07-04 2 views
1

私はtkinter.ttk.Notebookオブジェクトのタブトラバーサルのために複数のキーバインドをユーザーに提供したいと思います。私は、次のコードを使用しています:<制御-bracketleft>をバインドできません、<コントロール-bracketright>(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は、()はControl-Shiftキーを押しながらタブおよびコントロール・タブナビゲーションを可能と予想される動作を生成します。また、バインディングは、Control-PageUpおよびControl-PageDownのナビゲーションを可能にする、望ましい結果を生成します。

第三の選択肢は、しかし、失敗しました。私はControl-とControl-を介したナビゲーションを期待していましたが、何もしません。私は、キーシンボルが適切なTkのmanページをチェックして正しいことを確認し、キーシムはPythonインタプリタでエラーを生成しません。私の理解で

、Tkinterには、同じコールバックにバインドされた2つのイベントに問題があってはなりません。どこかで間違いを犯したのですか、またはブラケットキーがサポートされていませんか?ありがとう!

答えて

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-PageUpとControl-PageDownだけでなく、Control-TabとControl-Shift-Tabの2つのバインディングセットを提供しているからです。 2番目のバインディングペアは、tkinter.ttkで文書化されていません。 – IJKLefty

関連する問題