pygtk statusBar не будет обновляться из обработчика сигнала - PullRequest
0 голосов
/ 21 марта 2012

Итак, я целый день выдергиваю свои волосы, и мне не хватает терпения.

В основном у меня есть программа 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

1 Ответ

0 голосов
/ 15 мая 2012

Разместите весь код.

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

...