pygtk statusBar не будет обновляться из обработчика сигнала

Так что я рвал на себе волосы весь день, и у меня не хватило терпения.

В основном у меня есть программа pygtk, построенная из поляны. В нижней части главного окна находится строка состояния, которую я использую для отображения ошибок использования и сообщений о состоянии подключенного оборудования, и они используют функции, указанные ниже. Таким образом, все вызовы displayError исходят из моего объекта на основе взаимодействия с пользователем, и все они, кажется, работают. При тестировании я пытался вызывать displayCurrent, и это тоже работает. Проблема возникает, когда аппаратный процесс пытается использовать displayCurrent. Система работает так, что один из членов моего класса главного окна является интерфейсным объектом для оборудования. У этого есть отдельный процесс, использующий multiprocessing.Process, который отправляет сигнал каждый раз, когда он получает данные, причем данные представляют собой сообщение для вывода. У кого-нибудь есть идеи? Я буду рад объяснить что-нибудь более подробно, если это необходимо, это просто МНОГО кода, который нужно опубликовать, чтобы получить все детали.

def displayCurrent(self, message):
    print message
    if self.lastMess:
        self.statusBar.remove(self.normalID, self.lastMess)
    self.lastMess = self.statusBar.push(self.normalID, message)

def displayError(self, message, timeout = 5):
    """
    Function that takes an error message and raises it to the user via the statusbar
    timeout seconds later. 
    """
    print message
    mess = self.statusBar.push(self.urgentID, message)
    # clear statusbar
    gobject.timeout_add_seconds(timeout, self.clearStatus, self.urgentID, mess)

def clearStatus(self, cID, mID):
    #time.sleep(timeout)
    self.statusBar.remove(cID, mID)
    #print self.statusBar.remove_all(self.urgentID)
    print 'popped'
    return False

person Steinbex    schedule 20.03.2012    source источник


Ответы (1)


Выложи весь код.

Как правило, это не сработает, если вы находитесь в отдельном процессе. GTK (и все остальное) был разветвлен. Вам нужно использовать некоторую форму межпроцессного взаимодействия. Многопроцессорный модуль справится с этим за вас. Есть также хаки, которые вы можете сделать в GTK, такие как использование заголовка окна (например, Vim) или, возможно, вилка и розетка для связи; не соблазняйтесь этим.

person Ali Afshar    schedule 15.05.2012