Простой апплет панели Gnome в Python
Когда я нахожусь в поезде, я подключаю свой нетбук к моей горячей точке Wi-Fi Nexus One. Когда я прохожу через туннель, мой телефон явно теряет связь 3G и занимает некоторое время, чтобы восстановить его, как только появится поезд. Но логотип netbook wifi остается постоянным, поскольку он все еще подключен к самому телефону.
Я написал небольшую программу python, которая пытается выполнить ping-сервер и, таким образом, решает, доступен ли интернет (не стесняйтесь предлагать метод обнаружения интернет-соединения, который будет либо быстрее, либо использовать меньшую пропускную способность, поскольку я ограничусь в месяц).
Мой вопрос: как я могу создать апплет для GNOME Panel 2.30.2 в Python, чтобы графически отобразить этот статус, поэтому я могу решить, когда продолжать нажимать ссылки и ожидать, что интернет будет работать.
Я получил этот пример с кнопкой панели для работы, но хотел бы, чтобы значок изменялся в зависимости от ситуации.
Я использовал Python в течение нескольких лет, но раньше не был закодированным гномом. Я использую настольную версию ubuntu как мой логин, а не единство, 10.04.
Ответы
Ответ 1
Отметьте этот простой апплет, который я сделал. Он имеет значок, который изменяется в зависимости от событий. Просто замените логику своей логикой, и она должна сделать трюк. Еще лучше, он должен быть совместим со всеми средами, совместимыми с freedesktop.
Ответ 2
В будущем, действительно хороший справочник о том, как создавать индикаторы для Gnome3: http://candidtim.github.io/appindicator/2014/09/13/ubuntu-appindicator-step-by-step.html
Полный исходный код:
import signal
import json
from urllib2 import Request, urlopen, URLError
from gi.repository import Gtk as gtk
from gi.repository import AppIndicator3 as appindicator
from gi.repository import Notify as notify
APPINDICATOR_ID = 'myappindicator'
def main():
indicator = appindicator.Indicator.new(APPINDICATOR_ID, 'sample_icon.svg', appindicator.IndicatorCategory.SYSTEM_SERVICES)
indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
indicator.set_menu(build_menu())
notify.init(APPINDICATOR_ID)
gtk.main()
def build_menu():
menu = gtk.Menu()
item_joke = gtk.MenuItem('Joke')
item_joke.connect('activate', joke)
menu.append(item_joke)
item_quit = gtk.MenuItem('Quit')
item_quit.connect('activate', quit)
menu.append(item_quit)
menu.show_all()
return menu
def fetch_joke():
request = Request('http://api.icndb.com/jokes/random?limitTo=[nerdy]')
response = urlopen(request)
joke = json.loads(response.read())['value']['joke']
return joke
def joke(_):
notify.Notification.new("<b>Joke</b>", fetch_joke(), None).show()
def quit(_):
notify.uninit()
gtk.main_quit()
if __name__ == "__main__":
signal.signal(signal.SIGINT, signal.SIG_DFL)
main()