Доступ к неглобальной переменной в Python - PullRequest
3 голосов
/ 26 января 2012

Я пытаюсь изменить состояние значка статуса Gtk из потока, как указано в MailThread.run () ниже, но я не знаю, как получить объект значка статуса из метода, чтобы изменить set_visible либо True, либо False.

В основном, я хотел бы знать, что писать вместо "# set icon status visible on / on".

#!/usr/bin/env python

import gtk, sys, pynotify, imaplib, time, threading
from email import parser

class Mail:

    def check_mail(self):
        obj = imaplib.IMAP4_SSL('imap.gmail.com','993')
        acc = 'email'
        pwrd = 'pass'
        obj.login(acc, pwrd)
        obj.select()
        num = str(len(obj.search(None,'UnSeen')[1][0].split()))
        return acc, num

class MailThread(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)
        gtk.gdk.threads_init()

    def run(self):
        while True:
            print "hello"
            mail = Mail()
            num = mail.check_mail()[1]
            if num < 1:
                # set status icon visible off
            else:
                # set status icon visible on
            time.sleep(60)

class StatusIcon:

    # activate callback
    def activate( self, widget, data=None):
        mail = Mail()
        acc, num = mail.check_mail()
        pynotify.init("myapp")
        n = pynotify.Notification(acc, "You have " + num + " unread e-mails.", "emblem-mail")
        n.show()

   # Show_Hide callback
    def  show_hide(self, widget,response_id, data= None):
        if response_id == gtk.RESPONSE_YES:
            widget.hide()
        else:
            widget.hide()

    # destroyer callback
    def  destroyer(self, widget,response_id, data= None):
        if response_id == gtk.RESPONSE_OK:
            gtk.main_quit()
        else:
            widget.hide()

    # popup callback
    def popup(self, button, widget, data=None):
        dialog = gtk.MessageDialog(
        parent         = None,
        flags          = gtk.DIALOG_DESTROY_WITH_PARENT,
        type           = gtk.MESSAGE_INFO,
        buttons        = gtk.BUTTONS_OK_CANCEL,
        message_format = "Do you want to close e-mail notifications?")
        dialog.set_title('Exit')
        dialog.connect('response', self.destroyer)
        dialog.show()

    def __init__(self):
        # create a new Status Icon
        self.staticon = gtk.StatusIcon()
        self.staticon.set_from_icon_name("emblem-mail")
        self.staticon.connect("activate", self.activate)
        self.staticon.connect("popup_menu", self.popup)
        self.staticon.set_visible(True)
        # starting thread
        thread = MailThread()
        thread.setDaemon(True)
        thread.start()
        # invoking the main()
        gtk.main()        

if __name__ == "__main__":

    # status icon
    statusicon = StatusIcon()

1 Ответ

4 голосов
/ 26 января 2012

Вы можете принять значок состояния в потоке __init__():

class MailThread(threading.Thread):
    def __init__(self, status_icon = None):
        threading.Thread.__init__(self)
        gtk.gdk.threads_init()
        self.status_icon = status_icon

И затем вы можете использовать его в run().

Кроме того, вам нужно сделать всеGUI работает из основного потока.Основной поток имеет очередь, поддерживаемую GTK, которую вы можете использовать, чтобы заставить его выполнить некоторую работу с графическим интерфейсом.Вот как это работает:

def run(self):
    # <...>
    if num < 1:
        gobject.idle_add(self.set_status_icon, False)
    else:
        gobject.idle_add(self.set_status_icon, True)
    # <...>

def set_status_icon(self, state = False):
    # code that changes icon state goes here
    pass

idle_add в основном означает «добавить это в очередь и делать это, когда у вас есть свободное время».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...