美文网首页我用 LinuxLinux
ssr Linux图形化界面

ssr Linux图形化界面

作者: 霡霂976447044 | 来源:发表于2019-06-27 16:35 被阅读4次

    使用https://github.com/ShadowsocksR-Live/shadowsocksr-native编译好的二进制文件ssr-local,用gtk写一个简易图形化界面。
    具体代码

    #!/usr/bin/python3
    import signal, time, subprocess, threading
    
    import gi
    gi.require_version('Gtk', '3.0')
    from gi.repository import Gtk as gtk
    from gi.repository import AppIndicator3 as appindicator
    from gi.repository import Gtk
    
    APPINDICATOR_ID = 'myappindicator'
    
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    
    ERR_LOG_PATH = '/tmp/ssr-local-gui.log'
    ICON_ABS_PATH = '/home/alonebo/.themes/icon/Shadowsocks_for_Android.png'
    SSR_CONFIG_PATH = '/home/alonebo/config/config.json'
    
    SSR_RUNNING = False
    
    SSR_STATUS = 'stoped'
    
    SSR_CMD = None
    
    
    def cb_msg():
        global SSR_RUNNING, SSR_STATUS
        while not SSR_CMD.poll():
            time.sleep(2)
            SSR_RUNNING = True
            SSR_STATUS = 'running'
            print('running')
        else:
            SSR_RUNNING = False
            SSR_STATUS = 'stopped'
            print('stopped')
    
    class MyWindow(Gtk.Window):
    
        def __init__(self):
            self.window = Gtk.Window.__init__(self, title="ssr gui")
            
            self.set_default_size(180, 75)
            self.set_resizable(False)
            # self.set_decorated(False)
    
            self.vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
            self.set_icon_from_file(ICON_ABS_PATH)
            self.add(self.vbox)
    
            self.box = Gtk.Box(spacing=6)
            self.vbox.pack_start(self.box, False, False, 0)
    
            self.button1 = Gtk.Button(label="start")
            self.button1.connect("clicked", self.on_button1_clicked)
            self.box.pack_start(self.button1, True, True, 0)
    
            self.button2 = Gtk.Button(label="stop")
            self.button2.connect("clicked", self.on_button2_clicked)
            self.box.pack_start(self.button2, True, True, 0)
    
            self.entry = Gtk.Label()
            self.vbox.pack_start(self.entry, False, True, 0)
            self.connect('destroy', self.exit)
            self.init_status()
    
        def init_status(self):
            self.entry.set_text(SSR_STATUS)
    
        def late_update(self):
            time.sleep(3)
            self.entry.set_text(SSR_STATUS)
    
        def on_button1_clicked(self, widget):
            if SSR_RUNNING is True:
                self.entry.set_text('is running')
                return
            
            global SSR_CMD
            SSR_CMD = subprocess.Popen(['ssr-local', '-c', SSR_CONFIG_PATH], stdout=open('/dev/null', 'w'), stderr=open(ERR_LOG_PATH, 'w'))
            self.entry.set_text('staring')
            t = threading.Thread(target=cb_msg)
            t.start()
            self.late_update()
    
        def on_button2_clicked(self, widget):
            self.entry.set_text('stopping')
            global SSR_CMD
            if SSR_CMD:
                try:
                    SSR_CMD.kill()
                except Exception as e:
                    print(e)
                self.late_update()
    
        def exit(self, *arg, **kw):
            print('exit')
            self.destroy()
        
    
    
    def show_window(w):
        win = MyWindow()
        win.show_all()
    
    
    def main():
        indicator = appindicator.Indicator.new(APPINDICATOR_ID, ICON_ABS_PATH, appindicator.IndicatorCategory.SYSTEM_SERVICES)
        indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
        indicator.set_menu(build_menu())
        indicator.set_menu(build_menu())
        gtk.main()
    
    def build_menu():
        menu = gtk.Menu()
    
        item_show = gtk.MenuItem('Show')
        item_show.connect('activate', show_window)
        item_quit = gtk.MenuItem('Quit')
        item_quit.connect('activate', quit)
        menu.append(item_show)
        menu.append(item_quit)
        menu.show_all()
        return menu
    
    def quit(source):
        if SSR_CMD:
            try:
                SSR_CMD.kill()
            except Exception as e:
                print(e)
        gtk.main_quit()
    
    if __name__ == "__main__":
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        main()
    

    效果


    截图_2019-06-27_16-33-05.png 截图_2019-06-27_16-34-19.png

    相关文章

      网友评论

        本文标题:ssr Linux图形化界面

        本文链接:https://www.haomeiwen.com/subject/hkbrcctx.html