Помощь в вызове класса из класса выше - PullRequest
0 голосов
/ 13 апреля 2010

Как позвонить из класса oneThread: обратно в класс fun :? Например, обратитесь к классу, написанному ниже. Возможно ли это?

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 ]

1 голос
/ 13 апреля 2010

Вам нужно использовать правильные ссылки на полный объект или просто поле (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 голос
/ 13 апреля 2010

Элегантным решением было бы передать ссылку на экземпляр класса fun конструктору oneThread, как предлагали другие, но вы, похоже, пытаетесь сделать что-то другое: сделать класс fun как одиночный доступ доступом к нему как глобальному объекту. Это правильно? Обычно это плохая идея, но иногда имеет смысл.

Если это так, то вы делаете две ошибки:

  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 для доступа к нему позже).

Таким образом, код будет выглядеть так:

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 и в этом случае

И еще раз: это (использование синглтона в качестве глобальной переменной), вероятно, не тот путь.

0 голосов
/ 13 апреля 2010

Вам нужно передать экземпляр fun в конструктор oneThread:

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

class fun:
    def one(self, widget):
        oneThread(self):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...