Как заставить индикатор запускать различные команды? [дубликат]

Как мне сделать индикатор для панели на Unity? Мне нужна кнопка, которая показывает меню, и когда вы нажимаете на элементы меню, они запускают команды.

Как мне это сделать?

1
задан 28 November 2016 в 11:02

1 ответ

Индикатор, выполняя различные команды

Ответ ниже является отредактированной версией этого. Так как этот вопрос очень отличается от того, решенного для определения ответа там для обслуживания гибким способом к этому вопросу, читая и (меню) имена и команды от текстового файла.

enter image description here

Решение

Индикатор, читая строки из файла, названного commands, в котором и имя и команда определяются, один набор на строку. Имя (как это появляется в меню) и команда разделяется ||. Пример:

Gedit || gedit 
Go Home || nautilus $HOME

Сценарий

#!/usr/bin/env python3
import subprocess
import os
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3

currpath = os.path.dirname(os.path.realpath(__file__))

class Indicator():
    def __init__(self):
        self.app = 'update_setting'
        iconpath = currpath+"/icon.png"
        self.indicator = AppIndicator3.Indicator.new(
            self.app, iconpath,
            AppIndicator3.IndicatorCategory.SYSTEM_SERVICES)
        self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)       
        self.indicator.set_menu(self.create_menu())

    def getscripts(self):
        cmd_data = [l for l in open(
            os.path.join(currpath, "commands")
            ).read().splitlines()]
        cmd_data = [l.split("||") for l in cmd_data]  
        for cmd in cmd_data:
            menuitem = Gtk.MenuItem(cmd[0].strip())
            menuitem.connect("activate", self.run_script, cmd[1].strip())
            self.menu.append(menuitem)

    def create_menu(self):
        self.menu = Gtk.Menu()
        self.getscripts()
        # quit
        item_quit = Gtk.MenuItem('Quit')
        sep = Gtk.SeparatorMenuItem()
        self.menu.append(sep)
        item_quit.connect('activate', self.stop)
        self.menu.append(item_quit)
        self.menu.show_all()
        return self.menu

    def run_script(self, widget, script):
        subprocess.Popen(["/bin/bash", "-c", script])

    def stop(self, source):
        Gtk.main_quit()

Indicator()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()

Как использовать

  1. Скопируйте сценарий выше в пустой файл, сохраните его как run_commands.py
  2. Скопируйте значок ниже и сохраните его как (точно) icon.png в одной и той же папке как сценарий.

    enter image description here

  3. Создайте текстовый файл, также в одной и той же папке, (точно) названной: commands (никакое расширение).
  4. Заполните файл со своими командами и их именами, как:

    Gedit || gedit 
    Go Home || nautilus $HOME
    

    И имена могут включать пробелы и команды, может включать аргументы.

  5. Выполните индикатор командой:

    python3 /path/to/run_commands.py
    
1
ответ дан 7 December 2019 в 15:44

Другие вопросы по тегам:

Похожие вопросы: