Продолжение выполнения кода после pygtk.main () в python - PullRequest
0 голосов
/ 26 июля 2010

У меня есть приложение, в котором мой класс DataFetch () «оборачивается» вокруг моего класса HBHTray () с целью взаимодействия с функциями / переменными этого класса.К сожалению, я не могу заставить код продолжить выполнение после того, как мой класс DataFetch () создает экземпляр HBHTray и вызывает его, а в методе Start () HBHTray он зависает.

Это соответствующий код:

<code>
class DataFetch(): # I need the DataFetch class to be wrapping around HBHTray so I can call/edit certain variables from within functions in DataFetch
    def <strong>init</strong>(self):
        self.Interval, self.Username, self.Password, self.CheckShoutBox = GetOptions('.tray')
        self.Gui = HBHTray()
        print '1'
        self.Gui.Start()
        print '2'
    def Login(self):
        pass # Do stuff (Eg: Edit self.Gui.StatusIcon state or call self.Gui.Notify()
    def Start(self):
        print 'hi!'
        sleep(self.Interval)
        print 'Hi!'
class HBHTray():
    def <strong>init</strong>(self):
        self.StatusIcon = gtk.StatusIcon()
        self.StatusIcon.set_from_file('img')
        self.StatusIcon.set_tooltip('No new messages')
        self.Menu = gtk.Menu()
            self.CheckBox = gtk.CheckMenuItem('Notify')
            self.CheckBox.connect('activate', self.ChangeCheckBox)
            self.CheckBox.set_active(True)
            self.Menu.append(self.CheckBox)
        self.MenuItem = gtk.ImageMenuItem('Options')
        self.MenuItem.connect('activate', self.Options, self.StatusIcon)
        self.Menu.append(self.MenuItem)
        self.MenuItem = gtk.ImageMenuItem('About')
        self.MenuItem.connect('activate', self.About, self.StatusIcon)
        self.Menu.append(self.MenuItem)
        self.MenuItem = gtk.ImageMenuItem('Quit')
        self.MenuItem.connect('activate', self.Quit, self.StatusIcon)
        self.Menu.append(self.MenuItem)
        self.StatusIcon.connect('popup-menu', self.PopMenu, self.Menu)
        self.StatusIcon.set_visible(1)
    def PopMenu(self, widget, button, time, data = None):
        if data:
            data.show_all()
            data.popup(None, None, gtk.status_icon_position_menu, 3, time, self.StatusIcon)
    def Notify(self, message):
        pynotify.init('null')
        notification = pynotify.Notification('Something', message, 'dialogue')
        notification.attach_to_status_icon(self.StatusIcon)
        notification.show()
    def Start(self):
        gtk.main()
    def About(self, a, b):
        self.Notify('test')
    def Options(self, a, b):
        print a, b
    def ChangeCheckBox(self, null):
        pass
    def Quit(self, a, b):
        raise SystemExit
if <strong>name</strong> == '<strong>main</strong>':
    try:
        gobject.threads_init() # Doesn't work?
        Monitor = DataFetch()
        Monitor.Start()

Извините за ужасное форматирование, переполнение стека не похоже на пустые строки .... В любом случае, однако, "1"напечатано, но" 2 "нет.Итак, gtk.main (), очевидно, там, где он висит.Можно ли как-нибудь разрешить мне продолжить выполнение и заставить gtk go делать свое дело?

Ответы [ 2 ]

0 голосов
/ 26 июля 2010

Оказывается, проблема в том, что я не смог найти работающее решение, потому что я неправильно использовал модуль Thread и вызывал run () напрямую, когда мне следовало вызвать start ().Из-за этого я думал, что ничего не делал (особенно без ошибок или жалоб от чего-либо) и решил, что это проблема, связанная с тем, как я оборачиваю gtk.main ()

0 голосов
/ 26 июля 2010

gobject.threads_init() волшебным образом не помещает ваши вещи в отдельные темы. Он только сообщает библиотеке, что вы собираетесь использовать потоки, и устанавливает некоторую блокировку. Вам все равно придется создавать темы самостоятельно.

...