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'`

Код для объявления рассматриваемого опционального меню приведен ниже:

    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 дает ему возможность быть установленным. Я пробовал различные другие способы, если формулировать эту команду без лямбды, но, похоже, она не работает.

1 ответ

Решение

self.varFrame не нормально string но StringVar и вы не можете установить значение с помощью

 self.varFrame = ""

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

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

 self.varFrame.set("")
Другие вопросы по тегам