2016-01-24 56 views
0

我有兩個選項菜單,通過從另一個菜單中選擇一個值來更新一個菜單的內容。雖然這是一種相當普遍的情況,但我似乎無法使其發揮作用。我現在有它,這樣的選項更新,但在從第二,更新的盒子,它拋出下面的錯誤選擇項目:OptionMenu在項目更新後無法工作

self.SelectFrame['menu'].add_command(label=frame, command=lambda v = self.varFrame, l=frame:v.set(1)) 
AttributeError: 'str' object has no attribute 'set'` 

有問題的optionmenu聲明中的代碼如下:

self.varFrame = Tk.StringVar() 
    self.Frames = ["",""] 
    self.SelectFrame = Tk.OptionMenu(botLeftFrame, self.varFrame, *self.Frames) 
    self.varFrame.set("None selected") 
    self.SelectFrame.pack(side="left", padx = 5, pady = 10) 

在同一類的另一種方法是這樣的代碼:

def runSelectionChanged(self,*args): 
    cnxn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Users\Public\dbsDetectorBookingSystem.accdb') 
    cursor = cnxn.cursor() 
    cursor.execute("SELECT RunFilePath, RunID FROM tblRuns") 
    rows = cursor.fetchall() 
    for row in rows: 
     if row.RunFilePath == self.varRun.get(): 
      chosenRunID = row.RunID 

    sqlString = "SELECT LocalFilePath, RunID FROM tblFrames WHERE RunID=?" 
    cursor.execute(sqlString, str(chosenRunID)) 
    self.userFrames = cursor.fetchall() 
    self.Frames = ["",""] 
    for frame in self.userFrames: 
     self.Frames.append(frame.LocalFilePath) 


    newFrames = self.Frames 
    self.varFrame = "" 
    self.SelectFrame['menu'].delete(0, 'end') 
    for frame in newFrames: 
     self.SelectFrame['menu'].add_command(label=frame, command=lambda v = self.varFrame, l=frame:v.set(1)) 

,當你選擇它已被更新後的菜單中的項目將引發錯誤,我不明白爲什麼我確信lambda命令賦予它設置的能力。如果沒有使用lambda表達式這個命令,我嘗試過其他各種方式,但它似乎不起作用。

回答

1

self.varFrame是不正常的,但stringStringVar你不能

self.varFrame = "" 

這樣,你通過正常string取代StringVar設定值,現在你不能使用self.varFrame.set()(在你錯誤時被v.set()

你必須始終使用set()

self.varFrame.set("") 
+0

謝謝,我沒有發現 – JacobM

相關問題