2012-01-05 10 views
0

ここに私が考えている問題があります:Tkinterのウィジェットのルーピング

私は、フレーム内に多くの同様のウィジェットを持っています(例えば、Lables)。私は彼らに関連する機能にroot.update()を用いたアルゴリズム(のすべての反復を更新。私が知りたいのは何であり、どのように各ラベルをループする。

もちろん、それらは

self.var1=IntVar() 
self.lab1=Label(frame,textvariable=self.var1) 
self.lab1.grid() 
のようなものを使用して作成されました

各lablesの名前はlab1、lab2などです。名前を明示的に呼び出す必要はなく、どういうわけかそれらをループする必要はありません。

答えて

1

最も簡単な方法は、スケーラインスタンス変数ではなく(またはスケーラインスタンス変数に加えて)各ウィジェットへの参照をリストまたは辞書に格納することですs。

+0

あなたは 'リスト1 = [self.var1、self.var2]'して、リスト1 'をループ[リスト]のようなものを意味します' ? –

+0

@sigma:はい、それは一つの方法です。 –

7

あなたの一貫した名前スキームは、あなたの変数を反復処理する変数名を使用してみましょう:

for i in range(1,n): 
    label = getattr(self, "lab"+str(i)) 
あなたはまた、 childrenウィジェット属性を介してアクセスあなたのウィジェットのツリー構造を保持Tkinterのに頼って検討することができる

(辞書):

for child in frame.children.values(): 
    #do something to all children 

さらに、フレームに他のウィジェットが含まれている場合は、フィルタリングを追加してください。たとえば、ウィジェットのクラスをフィルタリングするには:

for label in filter(lambda w:isinstance(w,Label), frame.children.itervalues()): 
    #do something on labels 

子供はトラバーサルの順序を保証しないことに注意してください。そのようなサービスのために、あなたはすなわちpack_slavesまたはgrid_slaves、ジオメトリマネージャに関する情報に頼ることがあります。

for child in frame.pack_slaves(): 
    #traverse in pack addition order 
#or 
for child in reversed(frame.grid_slaves()): 
    #traverse in grid addition order 
関連する問題