2012-11-02 29 views
2

我有这个问题:用循环创建的多个Tkinter小部件充当一个单一的小部件。在例子中 - 如果我创建4个缩放元素,它们都作为一个 - 如果我选择一个滑块 - 所有滑块都被选中。与OptionMenu一样,尽管按钮没有问题。Python:Tkinter多个小部件作为一个

示例代码:

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) 

UPDATE

这是我如何创建SCALETEXT变量:

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

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

您能提供一个完整的(完整的)展示您的问题的例子吗? – FabienAndre

回答

3

这是在代码所缺少你已经证明的重要组成部分是在那里创建所有变量(self.scaleText[i])。我的猜测是,你最终将相同的变量分配给所有的scaleText[i]'s。

编辑您对所有小部件都使用相同的控制变量。 这里:

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

创建DoubleVar对象,并把它传递给appendValue()功能,它存储的是4份在列表中。所以你的小部件共享相同的控制变量,从而一致移动。

这种效果似乎违反直觉的人不熟悉的Python/Tkinter的,所以这里是一个非常简短的解释:

  • 在Python中,对象是通过引用传递,所以分配的对象时给一个变量(或将它传递给函数),您只需创建一个对现有对象的新引用。
  • 更改Tkinter变量会导致与其关联的任何窗口小部件(如果有)相应地更改其当前状态。 (实际上,有一个通用的mechanism,允许在访问TCL/Tk变量时接收通知)。
+0

我已更新我的帖子,看到上面,我不认为这是问题.. –

+0

@EžiukasStebintisPasaulį我已经更新了我的答案。 – atzz

+0

谢谢您的解答。 –

相关问题