Я хочу создать GUI-виджет, например, переключатель включения / выключения для запуска набора команд.
Например, чтобы включить и выключить точку доступа Wi-Fi с помощью ap-hotspot start/stop
.
Кто-нибудь, помогите мне ...
Можно практиковать универсальный метод для создания сценария/функциональности переключателя для настроек, соединений и т.д. Кроме того, Вы, вероятно, сможете снова использовать большую часть кода для различных ситуаций. Однако легкое "все в одном" решении, применимом в различных ситуациях и без любого ведома о, или чувствующий с кодированием, трудно дать. Вы зависите от природы двух состояний, которые сценарий должен переключить между, их соответствующие команды и метод, который можно использовать (или не) для проверки то, что является текущим состоянием.
Однако учитывая Ваш пример горячей точки переключателя, ниже три готовые использовать версии установки, от относительно простого до немного более сложного. Первые два являются самыми "универсальными"; третье для использования в Единице только.
Общая "анатомия" сценариев переключателя следующие:
> 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. Переключение с единственным начинающим (файл на рабочем столе) на Вашем рабочем столе
Самый простой: переключение через (фиксированного) начинающего на Вашем рабочем столе
Инструкции:
Значок:
Загрузите любой из значков снизу (щелкните правой кнопкой> безопасный как), безопасный это как toggle_icon.png
в месте по Вашему выбору.
Сценарий:
Скопируйте текст ниже, вставьте его в пустом файле и сохраните его как 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. Переключение от значка в средстве запуска Единицы, с переключающимся значком для показа текущего состояния
вниз / выполнение
(Этот пример не должен использоваться, как это находится на 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
Наконец, перетащите любой из файлов на рабочем столе на средстве запуска. Не волнуйтесь, выбрали ли Вы правильный или нет, он будет разглажен на первом показе.