2008年8月8日星期五

gtktunet

tunet二校门在Linux下只有命令行程序,我给包装成了gtk托盘图标的了。
StatusIcon很漂亮

#!/usr/bin/env python
import popen2, gtk

class MyTunetGTK():
    def __init__(self):
        self.tr = gtk.StatusIcon()
        self.tr.connect('popup-menu', self.on_popup_menu)
        self.tr.set_from_file('gif/tunet.gif')
        self.tr.set_visible(True)
        self.ui = gtk.UIManager()
        menu = """
        <ui><popup name="Popup">
                <menuitem action="Disconnect"/>
                <menuitem action="Limit"/>
                <menuitem action="Free"/>
                <separator/>
                <menuitem action="About"/>
                <menuitem action="Quit"/>
        </popup></ui>
        """
        ag = gtk.ActionGroup('Actions')
        ag.add_actions([
                ('About', gtk.STOCK_ABOUT, 'About', None, None, self.on_about),
                ('Quit', gtk.STOCK_QUIT, 'Quit', None, None, self.on_quit)
        ])
        ag.add_radio_actions([
            ('Disconnect', None, 'Disconnect', None, None, 0),
                ('Limit', None, 'Limit', None, None, 1),
                ('Free', None, 'Free', None, None, 2),
        ], 0, self.on_conn_changed)
        self.ui.insert_action_group(ag, 0)
        self.ui.add_ui_from_string(menu)
        self.menu = self.ui.get_widget('/Popup')

    def start(self):
        gtk.main()

    def on_popup_menu(self, status, button, time):
        self.menu.popup(None, None, None, button, time)
   
    def on_conn_changed(self, action, current):
        self.tr.set_from_file('gif/tunet.gif')
        self.local()
        self.status = action.get_current_value()
        if self.status == 1:
            self.conn_limit()
        elif self.status == 2:
            self.conn_free()

    def local(self):
        for i in range(3):
            p = popen2.Popen3("ps -C tunet o pid= | grep -m 1 . | xargs kill", True)
            s = p.fromchild.read()

    def conn_limit(self):
        f = popen2.Popen3("./inner", True).fromchild
        while True:
            line = f.readline()
            if line:
                if "DoConnect(503): ok!" in line:
                    self.tr.set_from_file('gif/green.gif')
                    break

    def conn_free(self):
        p = popen2.Popen3("./outter", True)
        f = p.fromchild
        while True:
            line = f.readline()
            if line:
                if "DoConnect(503): ok!" in line:
                    self.tr.set_from_file('gif/blue.gif')
                    break

    def on_about(self, data):
        dialog = gtk.AboutDialog()
        dialog.set_name('pygtk wrapper for tunet')
        dialog.set_version('0.1')
        dialog.set_authors(['wangyuantao@msn.com'])
        dialog.run()
        dialog.destroy()
           
    def on_quit(self, data):
        self.local()
        gtk.main_quit()

if __name__ == "__main__":
    m = MyTunetGTK()
    m.start()

没有评论: