2

私はこの問題を抱えています:ループで作成された複数のTkinterウィジェットが単一のウィジェットとして機能しています。たとえば、4つのスケール要素を作成すると、それらはすべて1つとして機能します。1つのスライダーを選択すると、すべてのスライダーが選択されます。ボタンに問題はありませんが、OptionMenuでも同じです。

サンプルコード:

def frame4Gui( self ):

    for i in range( 0, 4 ):
        self . guiElements[ 'Scale' + str( i ) ] = Scale( 
            self . guiElements[ 'LabelFrame4' ],
            variable = self . scaleText[ i ] )

    self . guiElements[ 'Scale0' ] . grid( row = 0, column = 0 )
    self . guiElements[ 'Scale1' ] . grid( row = 0, column = 1 )
    self . guiElements[ 'Scale2' ] . grid( row = 1, column = 0 )
    self . guiElements[ 'Scale3' ] . grid( row = 1, column = 1 )

    self . createBack( self . guiElements[ 'LabelFrame4' ], 2 )
    #Set Up frame4 Gui 
    self . openFrame( 4, 1 )

アップデート

これは私がscaleText変数を作成する方法です:

self . scaleText = self . appendValue( 4, DoubleVar( ) )

def appendValue( self, bound, value ):
    emptyList = [ ]
    for i in range( 0, bound ):
        emptyList . append( value )
    return emptyList
4

1 に答える 1

3

示したコードに欠けている重要な部分は、すべての変数を作成する場所です(self.scaleText[i])。私の推測では、すべてのscaleText[i]'に同じ変数を割り当てることになります。

編集すべてのウィジェットに同じ制御変数を使用します。ここ:

self . scaleText = self . appendValue( 4, DoubleVar( ) )

オブジェクトを作成し、DoubleVarそれを関数に渡します。関数は、オブジェクトappendValue()の4つのコピーをリストに格納します。したがって、ウィジェットは同じ制御変数を共有するため、一斉に移動します。

この効果は、Python / Tkinterに慣れていない人には直感に反しているように見えるかもしれないので、ここに非常に簡単な説明があります。

  • Pythonでは、オブジェクトは参照によって渡されるため、オブジェクトを変数に割り当てる(または関数に渡す)ときは、既存のオブジェクトへの新しい参照を作成するだけです。
  • 変数を変更するTkinterと、それに関連付けられているウィジェット(存在する場合)がそれに応じて現在の状態を変更します。(実際、TCL / Tk変数にアクセスしたときに通知を受信できる一般的なメカニズムがあります)。
于 2012-11-02T10:33:01.207 に答える