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

相关问题