Переключатель GUI для точки доступа Wi-Fi (вкл / выкл)

Я хочу создать GUI-виджет, например, переключатель включения / выключения для запуска набора команд.

Например, чтобы включить и выключить точку доступа Wi-Fi с помощью ap-hotspot start/stop.

Кто-нибудь, помогите мне ...

1
задан 15 May 2014 в 14:08

1 ответ

Можно практиковать универсальный метод для создания сценария/функциональности переключателя для настроек, соединений и т.д. Кроме того, Вы, вероятно, сможете снова использовать большую часть кода для различных ситуаций. Однако легкое "все в одном" решении, применимом в различных ситуациях и без любого ведома о, или чувствующий с кодированием, трудно дать. Вы зависите от природы двух состояний, которые сценарий должен переключить между, их соответствующие команды и метод, который можно использовать (или не) для проверки то, что является текущим состоянием.

Однако учитывая Ваш пример горячей точки переключателя, ниже три готовые использовать версии установки, от относительно простого до немного более сложного. Первые два являются самыми "универсальными"; третье для использования в Единице только.

Общая "анатомия" сценариев переключателя следующие:

> check what is the current_status
> if current_status = A:
      (switch icon to icon_b)
      run command to change state to B
      (check if toggle command was successful, if not > switch icon back)
> else:
      (switch launcher icon to icon_a)
      run command to change to change to A
      (check if toggle command was successful, if not > switch icon back)

Переключите установку; эти три примера

  1. Переключение с единственным начинающим (файл на рабочем столе) на рабочем столе.
  2. То же самое, но переключая значок также, для показа текущего состояния
  3. Переключение от значка в средстве запуска Единицы, с переключающимся значком для показа текущего состояния

Примечания:

  • Так как Вас попросят Вашего пароля, необходимо установить gksu, если это уже не находится в системе. Пример 3 не должен использоваться (как это) на 12,04 или ранее.
  • Следует иметь в виду, что сценарий, который просит разрешение администратора, является потенциальной угрозой безопасности. Если у Вас есть сомнения на том, кто делает, что на Вашем компьютере, сохраните его в безопасном каталоге.

1. Переключение с единственным начинающим (файл на рабочем столе) на Вашем рабочем столе

Самый простой: переключение через (фиксированного) начинающего на Вашем рабочем столе

Инструкции:

Значок:

Загрузите любой из значков снизу (щелкните правой кнопкой> безопасный как), безопасный это как toggle_icon.png в месте по Вашему выбору.

enter image description here enter image description here

Сценарий:

Скопируйте текст ниже, вставьте его в пустом файле и сохраните его как hotspot.py в месте по Вашему выбору.

#!/usr/bin/python3

import subprocess

# identifying string to look for when "pstree" is run
running_id = "ap-hotspot"

def check_ifrunning(): 
    # check if hotspot is up or down
    get_pstreeinfo = subprocess.Popen(["pstree"], stdout=subprocess.PIPE)
    output = (get_pstreeinfo.communicate()[0].decode("utf-8"))
    if running_id in output:
        return "running"
    else:
        return "not_running"

def toggle_connection():
    runcheck = check_ifrunning()  
    if runcheck == "not_running":
    # command to start hotspot (spaces replaced by ",")
        subprocess.Popen(["gksu", "ap-hotspot", "start"])
    else:
        # idem, stop hotspot
        subprocess.Popen(["gksu", "ap-hotspot", "stop"])

toggle_connection()

Создайте файл на рабочем столе:

Скопируйте текст ниже, вставьте его в пустом текстовом файле. Добавьте корректный путь к сценарию в Exec= строка, корректный путь в Icon= строка, и безопасный это на Ваш рабочий стол как hotspot_toggle.desktop. Сделайте это, исполняемый файл и Ваша установка должны работать.

[Desktop Entry]
Name=Hotspot toggle
Comment=Hotspot toggle
Categories=Accessories
Exec=python3 /path/to/script/hotspot.py
Icon=/path/to/icon/toggle_icon.png
Terminal=false
Type=Application
StartupNotify=true

2. Переключение с единственным начинающим (файл на рабочем столе) на Вашем рабочем столе, со значком изменяют эффект

Это - расширенная версия первого примера: значок изменится на toggle_officon.png / toggle_onicon.png на Вашем рабочем столе, в зависимости от того, включения - выключения ли горячая точка.

Инструкции:

Значки:

Загрузите оба значка с первого примера, безопасного их как

toggle_officon.png (the grey one)
toggle_onicon.png (the green one) 

в месте по Вашему выбору.

Сценарий:

Скопируйте текст ниже, вставьте его в пустом файле и сохраните его как hotspot.py в месте по Вашему выбору. Добавьте корректные пути к строкам, запускающимся с path_todtfile = (путь к файлу на рабочем столе, посмотрите далее ниже), icon_offpath = (соедините каналом к toggle_officon.png), и icon_onpath = (соедините каналом к toggle_onicon.png).Примечание: "Реальное" название файла на рабочем столе - то, как Вы назвали его при сохранении его. Имя, которое Вы видите в своем интерфейсе, определяется в Name= строка файла на рабочем столе.

#!/usr/bin/python3

import subprocess
import time

wait = 10

# identifying difference on pstree command on / off
running_id = "ap-hotspot"

# pathto_desktop file
path_todtfile = "/path/to/desktop_file/toggle.desktop"
# paths to icons
icon_offpath = "/path/to/toggle_off_icon/toggle_officon.png"
icon_onpath = "/path/to/toggle_on_icon/toggle_onicon.png"

def set_icon(set_mode, state):
    if state == "running":
        iconset = [icon_onpath, icon_offpath]
    else:
        iconset = [icon_offpath, icon_onpath]
    if set_mode == "set_current":
        appropriate_iconpath = iconset[0]
    else:
        appropriate_iconpath = iconset[1]
    with open(path_todtfile, "r") as editicon:
        editicon = editicon.readlines()
    line_toedit = [editicon.index(line) for line in editicon if\
                   line.startswith("Icon=")][0]
    if not editicon[line_toedit] == "Icon="+appropriate_iconpath+"\n":
        editicon[line_toedit] = "Icon="+appropriate_iconpath+"\n"
        with open(path_todtfile, "wt") as edited_icon:
            for line in editicon:
                edited_icon.write(line)
    else:
        pass

def check_ifrunning():
    # check if hotspot is up or down
    get_pstreeinfo = subprocess.Popen(["pstree"], stdout=subprocess.PIPE)
    output = (get_pstreeinfo.communicate()[0].decode("utf-8"))
    if running_id in output:
        return "running"
    else:
        return "not_running"

def toggle_connection():
    runcheck = check_ifrunning()
    set_icon("set_alter", runcheck)
    if runcheck == "not_running":
        subprocess.call(["gksu", "ap-hotspot", "start"])
    else:
        subprocess.call(["gksu", "ap-hotspot", "stop"])
    time.sleep(wait)
    runcheck = check_ifrunning()
    set_icon("set_current", runcheck)

toggle_connection()

Файл на рабочем столе:

Создайте файл на рабочем столе как в примере 1. Добавьте корректный путь к сценарию в Exec= строка, путь к любому из этих двух значков в Icon= (это будет разглажено на первом использовании), и безопасный это на Ваш рабочий стол как toggle.desktop. Сделайте это, исполняемый файл и Ваша установка должны работать.

3. Переключение от значка в средстве запуска Единицы, с переключающимся значком для показа текущего состояния

вниз / выполнение

enter image description here enter image description here

(Этот пример не должен использоваться, как это находится на 12,04 или ранее.)

Значки:

Загрузите оба значка с первого примера, безопасного их как

toggle_officon.png (the grey one)
toggle_onicon.png (the green one) 

в месте по Вашему выбору.

Сценарий:

Скопируйте текст ниже. вставьте его в пустом файле, сохраните его как hotspot.py в месте, которое подходит Вам.

#!/usr/bin/python3

import subprocess
import getpass
import time

# time to wait, to check if hotspot was established (set correct icon)
wait = 10
# identifying difference on pstree command
running_id = "ap-hotspot"
# location of the launcher restore script
backup_copy = "/home/"+getpass.getuser()+"/.restore_currentlauncher.sh"
# name of the desktop file if hotspot is down
mention_ifdown = 'application://hotspot_off.desktop'
# name of the desktop file if hotspot is running
mention_ifup = 'application://hotspot_on.desktop'

def check_ifrunning():
    # check if hotspot is up or down
    get_pstreeinfo = subprocess.Popen(["pstree"], stdout=subprocess.PIPE)
    output = (get_pstreeinfo.communicate()[0].decode("utf-8"))
    if running_id in output:
        return "running"
    else:
        return "not_running"

def read_currentlauncher():
    # read the current launcher contents
    get_launcheritems = subprocess.Popen([
        "gsettings", "get", "com.canonical.Unity.Launcher", "favorites"
        ], stdout=subprocess.PIPE)
    return eval((get_launcheritems.communicate()[0].decode("utf-8")))

def set_current_launcher(current_launcher):
    # before editing the launcher, create restore script
    backup_data = read_currentlauncher()
    with open(backup_copy, "wt") as create_backup:
        create_backup.write(
            "#!/bin/sh\n\n"\
            "gsettings set com.canonical.Unity.Launcher favorites "+\
            '"'+str(backup_data)+'"'
            )
    # preparing subprocess command string
    current_launcher = str(current_launcher).replace(", ", ",")
    subprocess.Popen([
        "gsettings", "set", "com.canonical.Unity.Launcher", "favorites",
        current_launcher,
        ]) 

def set_icon(change_mode):
    # defines the appropriate icon in the launcher
    state = check_ifrunning()
    if state == "running":
        if change_mode == "set_current":
            iconset = [mention_ifup, mention_ifdown]
        else:
            iconset = [mention_ifdown, mention_ifup]
    elif state == "not_running":
        if change_mode == "set_current":
            iconset = [mention_ifdown, mention_ifup]
        else:
            iconset = [mention_ifup, mention_ifdown]
    # set the defined icon
    current_launcher = read_currentlauncher()
    if iconset[0] in current_launcher:
        pass
    else:
        index = current_launcher.index(iconset[1])
        current_launcher.pop(index)
        set_current_launcher(current_launcher)
        time.sleep(1)
        current_launcher.insert(index, iconset[0])
        set_current_launcher(current_launcher)

def toggle_connection():
    set_icon("set_alter")
    runcheck = check_ifrunning()
    if runcheck == "not_running":
        subprocess.call(["gksu", "ap-hotspot", "start"])
    else:
        subprocess.call(["gksu", "ap-hotspot", "stop"])
    time.sleep(wait)
    set_icon("set_current")

toggle_connection()

Два файла на рабочем столе, которые переключатся в средство запуска:

Ниже двух файлов на рабочем столе Вам нужно. Откройте пустой текстовый файл, вставьте код ниже (в отдельных файлах), замените пути фактическими путями к значку (значкам), который Вы сохранили выше, и путь к сценарию, и сохраните их в ~/.local/share/applications, как hotspot_off.desktop, и hotspot_on.desktop:

hotspot_off.desktop:

[Desktop Entry]
Name=Hotspot off
Exec=python3 /path/to/script/hotspot.py
Icon=/path/to/toggle_officon/toggle_officon.png
Terminal=false
Type=Application
NoDisplay=true

hotspot_on.desktop:

[Desktop Entry]
Name=Hotspot on
Exec=python3 /path/to/script/hotspot.py
Icon=/path/to/toggle_officon/toggle_onicon.png
Terminal=false
Type=Application
NoDisplay=true

Наконец, перетащите любой из файлов на рабочем столе на средстве запуска. Не волнуйтесь, выбрали ли Вы правильный или нет, он будет разглажен на первом показе.

5
ответ дан 15 May 2014 в 14:08

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

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