2012-11-02 54 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

謝謝您的解答。 –

相關問題