帮助从上面的课程中调用课程

时间:2010-04-12 21:03:03

标签: python

如何从班级致电线程:回到课堂乐趣:?如同,在下面写的课程。有可能吗?

class oneThread(threading.Thread):
        def __init__(self):
                threading.Thread.__init__(self)
                self.start()

        def run(self):            
            print "1"
            time.sleep(1)
            print "2"
            time.sleep(1)
            print "3"
            self.wTree.get_widget("entryResult").set_text("Done with One.") # How to call from here back to class fun, which of course is below...? 

class fun:
        wTree = None
        def __init__( self ):                
                self.wTree = gtk.glade.XML( "main.glade" )
                self.wTree.signal_autoconnect( {"on_buttonOne" : self.one} )              
                gtk.main()

        def one(self, widget):
                oneThread();

gtk.gdk.threads_init()         
do=fun()

3 个答案:

答案 0 :(得分:1)

您需要使用对完整对象的正确引用 或者只是(wTree)的一个领域。

self.fun.wTree 如果您将self传递给oneThread类

self.wTree 如果您传递gtk.glade.XML对象

见评论......

class oneThread(threading.Thread):
    def __init__(self, reference):
        self.fun = reference
        #or self.wTree = reference
        threading.Thread.__init__(self)
        self.start()

    def run(self):
        print "1"
        time.sleep(1)
        print "2"
        time.sleep(1)
        print "3"
        self.fun.wTree.get_widget("entryResult").set_text("Done with One.")
        # or self.wTree.get_widget("entryResult").set_text("Done with One.")

class fun(object):
    def __init__( self ):
        self.wTree = gtk.glade.XML( "main.glade" )
        self.wTree.signal_autoconnect( {"on_buttonOne" : self.one} )
        gtk.main()

    def one(self, widget):
        oneThread(self)
        # or oneThread(self.wTree)

答案 1 :(得分:1)

优雅的解决方案是将类fun实例的引用传递给oneThread构造函数,正如其他人所建议的那样,但您似乎正在尝试做其他事情:将有趣的类作为singleton进行访问,将其作为全局对象进行访问。是对的吗?这通常是一个坏主意,但有时是有道理的。

如果是这种情况,那么你犯了两个错误:

  1. 您在self.fun中使用oneThread.run,尽管'fun'不是oneThread类或其实例的一部分。您应该只使用“有趣”来访问课程“有趣”。下面定义它并不重要,因为代码将在已定义类时执行。
  2. fun.__init__中您没有编写类属性fun.wTree,而是创建实例属性wTree。类属性fun.wTree将保留None。要改变它 请改用fun.wTree = gtk.glade.XML( "main.glade" )(但是,您可以继续使用self.wTree来访问它。)
  3. 所以代码看起来像这样:

    class oneThread(threading.Thread):
        def __init__(self):
                threading.Thread.__init__(self)
                self.start()
    
        def run(self):            
            print "1"
            time.sleep(1)
            print "2"
            time.sleep(1)
            print "3"
            fun.wTree.get_widget("entryResult").set_text("Done with One.") 
    
    class fun:
        wTree = None
        def __init__( self ):                
                fun.wTree = gtk.glade.XML( "main.glade" )
                self.wTree.signal_autoconnect( {"on_buttonOne" : self.one} )              
                gtk.main()
    
        def one(self, widget):
                oneThread();
    
    gtk.gdk.threads_init()         
    do=fun()
    

    我也建议在这种情况下将wTree属性重命名为instance

    再一次:这个(使用单例作为一种全局变量)可能不是可行的方法。

答案 2 :(得分:0)

您需要将fun实例传递给oneThread构造函数:

class oneThread(threading.Thread):
    def __init__(self, fun):
        self.fun = fun
        ...

class fun:
    def one(self, widget):
        oneThread(self):