必须使用y实例作为第一个参数调用unbound方法x()(改为使用int实例)

时间:2015-07-13 13:05:30

标签: python multithreading instance

我的Python程序有很多代码,所以我希望你没关系,我给你的部分代码是我的问题。我已经为Tkinter创建了一个线程,我正在尝试访问该线程中的一个函数。这就是它的样子:

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)

老实说,我不知道实例是什么,我必须将其作为第一个参数。

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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")