2010-04-12 50 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了。

再一次:這(使用單例作爲一種全局變量)可能不是要走的路。