2012-01-26 10 views
3

Gtkステータスアイコンの状態を以下のMailThread.run()で指定されたスレッドから変更しようとしていますが、ステータスアイコンオブジェクトに到達する方法がわかりませんこのメソッドからset_visibleをTrueまたはFalseに変更します。Pythonで非グローバル変数にアクセスする

基本的には、「#状態アイコンを表示/非表示にする」の代わりに何を書きたいのかを知りたいと思います。

#!/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() 

答えて

4

あなたがでステータスアイコンを受け入れることができ、スレッドの__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によってメンテナンスされたキューを持っています.GUIを使用してGUIの作業を行うように指示することができます。これは、それがどのように動作するかです:

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基本的には「キューにそれを追加し、あなたには、いくつかの自由な時間があるときにそれを行う」という意味します。

+0

ありがとう、それは仕事をしました。 – Max

+0

@Max:問題はないし、Stack Overflowへようこそ!私の答えがあなたの問題を解決した場合は、その横のチェックマークをクリックして問題を受け入れることができます。 – cha0site

+0

ありがとう、cha0site。チェックマークが見つかりました。 問題を修正しましたが、アイコンを非表示から非表示に変更する際に、奇妙な「BadIDChoice」エラーが発生しています。他の方法はうまく動作します。 – Max

関連する問題