2011-07-13 32 views
6

私は、作業中のtkinterアプリケーションでタブ順序を設定する方法を探していました。現在のところ、デフォルトの注文はトップダウンで動作しているようですが、CTRL + タブを使用してコントロールを繰り返し実行する必要があります。tkinterアプリケーションでタブ順序を設定する方法は?

ためと、より多くのように、CTRL +タブにちょうどタブを変更をカスタマイズする方法はありますか?

答えて

11

タブの順序は、スタックの順序に基づいており、デフォルトでウィジェットが作成される順序に基づいています。 tkraise(またはlift)とlowerの方法を使用して、積み重ね順序(したがってタブ順序)を調整することができます。

これはCTRL +タブを押す必要なく、あなたのために箱から出して作業する必要があります。ただし、タブではフォーカスを別のコントロールに移動するのではなく、テキストウィジェットにリテラルタブを挿入することに注意してください。そのデフォルトの動作はもちろん変更できます。

ここでは、タブの順序を逆にする方法の例を示します。例を実行する場合、最初のエントリのtabキーを押すと最後に移動します。もう一度タブを押すと、最初は、泡立ち、ネイティブTkコマンドはraiselowerですが、raiseが、それはTkinterでは名前を変更する必要がありましたPythonの予約語であるため、という

注を繰り返し、すすぎ、第二に移動します。

import Tkinter as tk 


class SampleApp(tk.Tk): 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     e1 = tk.Entry(self) 
     e2 = tk.Entry(self) 
     e3 = tk.Entry(self) 

     e1.insert(0,"1") 
     e2.insert(0,"2") 
     e3.insert(0,"3") 

     e1.pack() 
     e2.pack() 
     e3.pack() 

     # reverse the stacking order to show how 
     # it affects tab order 
     new_order = (e3, e2, e1) 
     for widget in new_order: 
      widget.lift() 


if __name__ == "__main__": 
    app = SampleApp() 
    app.mainloop() 

あなたがCTRL +タブをしなければならない言及しているので、私はあなたがテキストウィジェットからタブキー変更フォーカスを持ってしようとしている推測しています。通常、タブキーはリテラルタブを挿入します。フォーカスを変更したい場合は、<Tab>イベントへのバインディングを追加するだけです。

Tkinterには、フォーカスを取得する次のウィジェットの名前を返す関数があります。残念ながら、古いバージョンのTkinterではその機能はバグです。しかし、それを回避するのは簡単です。上記のコードに追加できる方法はいくつかあります:

def _focusNext(self, widget): 
     '''Return the next widget in tab order''' 
     widget = self.tk.call('tk_focusNext', widget._w) 
     if not widget: return None 
     return self.nametowidget(widget.string) 

    def OnTextTab(self, event): 
     '''Move focus to next widget''' 
     widget = event.widget 
     next = self._focusNext(widget) 
     next.focus() 
     return "break"