2015-07-13 101 views
1

我的Python程序有很多代碼,所以我希望你很好,我給你代碼的一部分問題是關於。我爲Tkinter創建了一個線程,我試圖訪問此線程中的一個函數。這是什麼樣子:未綁定的方法x()必須用y實例作爲第一個參數調用(改爲int實例)

class GUI (threading.Thread): 
    def __init__(self, num): 
     threading.Thread.__init__(self) 

    def run(self): 
     window = Tk() 
     window.title('GUI') 
     window = Canvas(window, width=400, height=200) 
     window.pack() 


    def output(lampe, status): 
     if status == 0: 

      if lampe == 21: 
       window.create_oval(140, 30, 160, 10, fill="#FFA6A6") 
      if lampe == 20: 
       window.create_oval(170, 30, 190, 10, fill="#FAFAAA") 

GUI.output(21,0) 

這是我得到的消息:

TypeError: unbound method output() must be called with GUI instance as first argument (got int instance instead)

說實話,我不知道情況是什麼,我不得不提及的第一個論點。

回答

1

你試圖訪問它作爲一個靜態方法,所以你需要對其進行註解@staticmethod

@staticmethod 
    def output(lampe, status): 
     if status == 0: 

      if lampe == 21: 
       window.create_oval(140, 30, 160, 10, fill="#FFA6A6") 
      if lampe == 20: 
       window.create_oval(170, 30, 190, 10, fill="#FAFAAA") 
+0

謝謝,那個人工作。但現在我得到另一個錯誤信息:'in output window.create_oval(140,30,160,10,fill =「#FFA6A6」) NameError:未定義全局名'window''。有沒有辦法從輸出函數訪問'窗口'? – lumpi

+0

@lumpi你可以通過在'run'方法的開頭添加'global window'來解決這個問題,但是你很可能會得到更多的錯誤。 – tynn

+0

這是我第一次打算。令我驚訝的是,我沒有得到任何其他的錯誤 - 我看到完全一樣的錯誤。既不在'run'-方法也不在外面。 – lumpi

2

實例是python函數需要的對象實例,在你的案例'self' 中閱讀了dive into python中的精彩解說。你需要理解爲什麼在Python中的類方法中使用self。對於您的問題,請查看此代碼。

class GUI (threading.Thread): 
    window=object 
    def __init__(self, num): 
     threading.Thread.__init__(self) 

    def run(self): 
     self.window = Tk() 
     self.window.title('GUI') 
     self.window = Canvas(self.window, width=400, height=200) 
     self.window.pack() 

    @staticmethod 
    def output(lampe, status): 
     if status == 0: 

      if lampe == 21: 
       window.create_oval(140, 30, 160, 10, fill="#FFA6A6") 
      if lampe == 20: 
       window.create_oval(170, 30, 190, 10, fill="#FAFAAA") 

GUI.output(21,0) 

其他實現了OP

class Gui(): 
    def __init__(self): 
     window = Tk() 
     window.title('GUI') 
     self.window = Canvas(window, width=400, height=200) 
     self.window.pack() 

    def output(self,lampe, status): 
     if status == 0: 
      if lampe == 21: 
       self.window.create_oval(140, 30, 160, 10, fill="#FFA6A6") 
      if lampe == 20: 
       self.window.create_oval(170, 30, 190, 10, fill="#FAFAAA") 

和實現這個

gui=Gui() 
thread=threading.Thread(target=gui.output, args=(21,0)) 
thread.start() 
+0

這根本沒有幫助。你仍然試圖從類中訪問'output',而不創建一個實例。這段代碼現在會引發TypeError。 –

+0

@DanielRoseman這個編輯怎麼樣? – Ja8zyjits

+0

如果你訪問'cls.window',它將成爲'object'。如果你想'cls'作爲參數,你必須用['@ classmethod']註釋它(https://docs.python.org/2/library/functions.html#classmethod) – tynn

相關問題