2012-04-30 22 views
1

我在做什麼錯?我想「refreshB」按鈕來調用「更新」 DEF但我得到一個nameError代替類lambda回調NameError

class monitor(): 
    def update(self): 
     print "Called" 

    mon = Tk() 
    mainFrame = Frame(mon) 
    mainFrame.grid(row=1, column=1) 

    optionFrame = Frame(mainFrame) 
    optionFrame.grid(row=1, column=1) 

    refreshB = ttk.Button(optionFrame, text='Refresh', command=lambda: update('self')) 
    refreshB.grid(row=1, column=1) 

    mon.mainloop() 

monitor() 


**NameError: global name 'update' is not defined** 

我一個不是很熟悉的類,有沒有別的東西我應該補充?

如果上面的腳本是不是一個班的話,我會用:

refreshB = ttk.Button(optionFrame, text='Refresh', command=lambda: update) 

這會工作得很好......

+0

您正在將類構造視爲一個函數。他們不是一回事。當你調用一個類時,它不會執行類中的代碼。相反,它調用類中定義的__init__方法並返回該類的新實例。 –

回答

1

將所有的初始化代碼初始化函數中。然後參考update()作爲self.update()

class Monitor(object): 
     def update(self, event): 
      print "Called" 

     def __init__(self): 
      self.mon = Tk() 
      self.mainFrame = Frame(self.mon) 
      self.mainFrame.grid(row=1, column=1) 

      self.optionFrame = Frame(self.mainFrame) 
      self.optionFrame.grid(row=1, column=1) 

      self.refreshB = ttk.Button(self.optionFrame, text='Refresh', command=self.update) 
      self.refreshB.grid(row=1, column=1) 

     def run(self): 
      self.mon.mainloop() 

    monitor = Monitor() 
    monitor.run() 

,因爲它是一個instancemethod,而不是一個類方法的update()參考不在這裏工作了。不是因爲使用lambda - 儘管我不知道爲什麼你需要使用lambda函數。我的解決方案涉及創建一個Monitor的實例。這很有用,因爲它允許您控制執行Monitor中的代碼的時間。 (否則你的班主體中的代碼會在定義時間執行,所有呼叫monitor()都會返回一個類monitor的實例 - 它不會執行代碼的主體)

+0

啊謝謝你爲我清理那個。我對Python仍然很陌生,現在只用了3個月左右。我使用了lambda,以便可以將對象傳遞給被調用的def。它在過去爲我工作,但我只是在學習如何使用類。再次感謝您的幫助和時間:) – user1159817

0

你不應該真的有代碼直接在課堂上有副作用。你幾乎肯定希望所有的代碼是在__init__函數來代替,在創建monitor對象後調用:

def __init__(self): 
    mon = Tk() 
    etc... 

接下來,update是一個實例方法,因此有一個對象上調用。你可能希望這樣的:

refreshB = ttk.Button(optionFrame, text='Refresh', command=lambda: self.update('self')) 

但後來,因爲你的update方法不帶任何參數超出隱含self說法,其實你可能希望這樣的:

refreshB = ttk.Button(optionFrame, text='Refresh', command=lambda: self.update()) 

最後,lambda是沒用的間接。爲什麼不直接將該方法作爲回調函數而不是將其包裝在lambda中?

refreshB = ttk.Button(optionFrame, text='Refresh', command=self.update) 
+0

啊,你是正確的。我使用lambda來傳遞參數,我只是忘了將它包含在我的示例代碼中。但非常感謝,你的解釋也非常有幫助。如果我可以給你一個複選標記,我會這樣做。 – user1159817