2015-07-13 41 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

相关问题