2011-06-30 9 views
1

私のpython/Tkinterでは書いたとCtrl-Bにバインドさ関数は(特定:text.index(SEL_FIRST)は未定義になるように、それは、選択したテキストの値を失っていた)妙振る舞ったとき、私は驚きました。control-b:それは予約されていますか?

もっとありそうなものを変更した後、私は何か他のものに代わりにそれをバインドされると、私は驚いた - そしてそれは働きました!

私は検索が、何かを見つけるdidntは:コントロール-B Tkinterでは何かのデフォルトにバインドされ???

アレッサンドロ

+4

コード、コード、コードを--showたちのコード –

答えて

0

あなたがofficial tk text widget documentationから、テキストウィジェットについて話している場合:

「左右キーが左または右 に 挿入カーソルを1つの文字を移動し、彼らもコントロール-Bと コントロール-Fはそれぞれ、左と右の と同じように振る舞う...テキスト内の任意の 選択を解除します。」

+0

はい、テキストウィジェットの話。私はhttp://infohost.nmtでTkinterのドキュメントを使っていたので、私はそれをdocで見つけられませんでした。edu/tcc/help/pubs/tkinter/text.htmlにあります。そう...??? Control-bは何らかの形で再マッピングできませんか? – alessandro

+0

@alessandro:はい、再マッピングできます。 Tkのすべてのバインディングは、変更、削除、置換、または拡張することができます。それはTkの大きな強みの1つです。バインディングは、メソッド 'bind_class'を使ってアクセスできるテキストウィジェットクラス" Text "にあります。私は小さなコメントで完全な説明を与えることはできませんので、tkのbindtagsとクラスバインディングについて少し研究してください。 'return break'がウィジェットバインドで何をするのかについても読んでいます(一般的に言えば、同じイベントへのクラスバインディングが起動するのを防ぎます) –

0

ブライアンは、ここにリンクがありますありがとう - 明らかeffbot http://effbot.org/tkinterbook/tkinter-events-and-bindings.htmに:あなたは、クラス レベルでバインディングを変更 にbind_classメソッドを使用することができ

(...)

しかし、それは アプリケーション内のすべてのテキストウィジェットの動作を変更します( )。より簡単な解決策は、 にTkinterが イベントを他のハンドラに伝播させないようにすることです。あなたが本当に 動作を変更したい場合は、ところで

def ignore(event): 
    return "break" 
text.bind("<Return>", ignore) 

または

text.bind("<Return>", lambda e: "break") 

:ちょうどあなたのイベント ハンドラから 文字列「休憩」を返しますあなたのアプリケーションのすべてのテキスト ウィジェットのうち、 bind_class方法:

top.bind_class("Text", "<Return>", lambda e: None) 

しかし、あなたは これを行うべきではない理由がたくさんあります。例えば、完全に日 物事を台無しに それはあなたが がネットからダウンロードしたいくつかのクールな小さなUIコンポーネントを使用してアプリケーション を拡張したいです。より良い 独自のテキストウィジェット特化、 を使用して そのままのTkinterのデフォルトのバインディングを保つ:

class MyText(Text): 
    def __init__(self, master, **kw): 
     apply(Text.__init__, (self, master), kw) 
     self.bind("<Return>", lambda e: "break") 
関連する問題