2010-04-12 87 views
0

如何从课程oneThread调用:返回课程乐趣:?如下所示,填写下面写的课程。可能吗?从上面的课程帮助调用课程

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() 

回答

0

您需要的fun实例传递给oneThread构造:

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

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

或只是通过wTree,如果这就是你所关心的。 – 2010-04-12 21:12:28

+0

我收到一个错误:AttributeError:'oneThread'对象没有属性'wTree' @ dash-tom-bang请给我举个例子。 – wtz 2010-04-12 21:31:07

+0

将上例中'fun'的所有实例重命名为'wTree'。 – 2010-04-12 22:43:32

1

您需要使用正确的引用到完整的对象 或只是一个(在wTree)字段。

self.fun.wTree如果你通过自己的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

优雅的解决方案是将参考传递给class fun insta如同其他人所建议的那样,但您似乎正在尝试做其他事情:将有趣的类作为单例,将其作为全局对象进行访问。是对的吗?这通常是一个坏主意,但有时候是有道理的。

如果是这样的话,那么你正在两个错误:

  1. 您使用oneThread.runself.fun,虽然“乐”是不是oneThread类或它的实例的一部分。你应该使用'有趣'来访问'趣味'类。它在下面定义并不重要,因为代码将在类已经定义时执行。
  2. in fun.__init__您不写类属性fun.wTree,但创建实例属性wTree。班级属性fun.wTree将保持None。要改变它 改为使用fun.wTree = gtk.glade.XML("main.glade")(尽管如此,您可以继续使用self.wTree以后访问它)。

因此,代码是这样的:

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了。

再一次:这(使用单例作为一种全局变量)可能不是要走的路。