2016-01-24 7 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)) 

ошибка генерируется, когда вы выбираете пункт из меню после того, как он был обновлен, я не понимаю почему, поскольку я уверен, что команда лямбда дает ему возможность быть установленным. Я пробовал другие способы, если формулировать эту команду без лямбда, но она не работает.

ответ

1

self.varFrame не является нормальным, но stringStringVar, и вы не можете установить значение по

self.varFrame = "" 

Таким образом, вы заменили StringVar нормальным string и теперь вы не можете использовать self.varFrame.set() (в вас ошибка это v.set())

Вы должны всегда использовать set()

self.varFrame.set("") 
+0

Спасибо, я не заметил, что – JacobM

 Смежные вопросы

  • Нет связанных вопросов^_^