Как мне узнать текущее энергопотребление в строке состояния? (Разработка значка состояния)
Я хотел спросить, как я могу разработать простой скрипт / приложение и поместить его в строку состояния в ближайшее время (вверху справа). Допустим, у меня есть ноутбук, и скрипт каждые 10 секунд получает текущее потребление батареи в ваттах, поэтому оно отображается в строке состояния. Пользуюсь ubuntu 16 единством
2 ответа
Ubuntu предоставляет набор библиотек и примеров для их использования для миграции простых меню и непротиворечивого интерфейса.
Примеры в приведенном выше документе включают версии на следующих языках:
- С
- PYGI
- PyGtk
- C#
- Вала
- Haskell
Пример Python` со страницы:
#!/usr/bin/env python
#
# Copyright 2009-2012 Canonical Ltd.
#
# Authors: Neil Jagdish Patel <neil.patel@canonical.com>
# Jono Bacon <jono@ubuntu.com>
# David Planella <david.planella@ubuntu.com>
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of either or both of the following licenses:
#
# 1) the GNU Lesser General Public License version 3, as published by the
# Free Software Foundation; and/or
# 2) the GNU Lesser General Public License version 2.1, as published by
# the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranties of
# MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
# PURPOSE. See the applicable version of the GNU Lesser General Public
# License for more details.
#
# You should have received a copy of both the GNU Lesser General Public
# License version 3 and version 2.1 along with this program. If not, see
# <http://www.gnu.org/licenses/>
#
from gi.repository import Gtk
from gi.repository import AppIndicator3 as appindicator
def menuitem_response(w, buf):
print buf
if __name__ == "__main__":
ind = appindicator.Indicator.new (
"example-simple-client",
"indicator-messages",
appindicator.IndicatorCategory.APPLICATION_STATUS)
ind.set_status (appindicator.IndicatorStatus.ACTIVE)
ind.set_attention_icon ("indicator-messages-new")
# create a menu
menu = Gtk.Menu()
# create some
for i in range(3):
buf = "Test-undermenu - %d" % i
menu_items = Gtk.MenuItem(buf)
menu.append(menu_items)
# this is where you would connect your menu item up with a function:
# menu_items.connect("activate", menuitem_response, buf)
# show the items
menu_items.show()
ind.set_menu(menu)
Gtk.main()
Вы можете использовать программу из списка в качестве оболочки для вашего скрипта, так что нажатие на элемент вызовет ваш скрипт.
Создание иконки и текста динамическими
(Взято из: Как я могу написать динамически обновляемое приложение панели / индикатор?)
Этот пример предлагает использовать GObject
, Вызов gobject.threads_init()
инициализация приложения. Затем запустите ваши потоки нормально, но убедитесь, что потоки никогда не выполняют задачи GUI напрямую. Вместо этого вы используете gobject.idle_add
планировать задачу GUI напрямую.
(Выше приведена точная цитата из ссылки на случай, если ссылка перестанет работать.)
#!/usr/bin/env python3
import signal
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, AppIndicator3, GObject
import time
from threading import Thread
class Indicator():
def __init__(self):
self.app = 'test123'
iconpath = "/opt/abouttime/icon/indicator_icon.png"
self.indicator = AppIndicator3.Indicator.new(
self.app, iconpath,
AppIndicator3.IndicatorCategory.OTHER)
self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
self.indicator.set_menu(self.create_menu())
self.indicator.set_label("1 Monkey", self.app)
# the thread:
self.update = Thread(target=self.show_seconds)
# daemonize the thread to make the indicator stopable
self.update.setDaemon(True)
self.update.start()
def create_menu(self):
menu = Gtk.Menu()
# menu item 1
item_1 = Gtk.MenuItem('Menu item')
# item_about.connect('activate', self.about)
menu.append(item_1)
# separator
menu_sep = Gtk.SeparatorMenuItem()
menu.append(menu_sep)
# quit
item_quit = Gtk.MenuItem('Quit')
item_quit.connect('activate', self.stop)
menu.append(item_quit)
menu.show_all()
return menu
def show_seconds(self):
t = 2
while True:
time.sleep(1)
mention = str(t)+" Monkeys"
# apply the interface update using GObject.idle_add()
GObject.idle_add(
self.indicator.set_label,
mention, self.app,
priority=GObject.PRIORITY_DEFAULT
)
t += 1
def stop(self, source):
Gtk.main_quit()
Indicator()
# this is where we call GObject.threads_init()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
Вместо того, чтобы считать обезьян:-), я изменил второй сценарий из ответа Л.Д. Джеймса, чтобы показать текущее энергопотребление моего ноутбука в ваттах.
Скрипт работает с Ubuntu 16.04 и, вероятно, единственной специфической для системы вещью является файл, в котором хранится значение текущего энергопотребления. В моем случае я нашел это с помощью tlp
:
$ sudo tlp stat | grep -P '\[m(W|A)\]' # Output on Lenovo ThinkPad X230 Tablet
/sys/class/power_supply/BAT0/power_now = 11246 [mW]
$ sudo tlp stat | grep -P '\[m(W|A)\]' # Output on Dell Vostro 3350 Laptop
/sys/class/power_supply/BAT0/power_now = 6700 [mA]
Обратите внимание, что некоторые устройства обеспечивают потребление тока в ваттах, но некоторые устройства предоставляют текущие значения напряжения и тока (в амперах) - и сценарий покрывает эти случаи.
Далее я создал GitHub Project PowerNow и добавил дополнительные опции: выполнить htop
, powertop
или же tlp stat
в пределах gnome-terminal
,
Установка скрипта Python powerNow
и, опционально, Startup Applications (и ~/Desktop) .desktop
файлы:
Скопируйте скрипт в
/usr/local/bin
сделать его доступным для всей системы команд оболочки:sudo wget https://raw.githubusercontent.com/pa4080/powerNow/master/powerNow.py -O /usr/local/bin/powerNow sudo chmod +x /usr/local/bin/powerNow
Скопируйте скрипт в
~/bin
сделать его доступным только для текущего пользователя:wget https://raw.githubusercontent.com/pa4080/powerNow/master/powerNow.py -O $HOME/bin/powerNow chmod +x $HOME/bin/powerNow
Скопируйте файл рабочего стола в
~/Desktop
(требуется скрипт):wget https://raw.githubusercontent.com/pa4080/powerNow/master/powerNow.desktop -O $HOME/Desktop/powerNow.desktop chmod +x $HOME/Desktop/powerNow.desktop
Скопируйте файл рабочего стола в
~/.config/autostart
(требуется скрипт):wget https://raw.githubusercontent.com/pa4080/powerNow/master/powerNow.desktop -O $HOME/.config/autostart/powerNow.desktop chmod +x $HOME/.config/autostart/powerNow.desktop