Как периодически обновлять текст метки Gtk3? - PullRequest
0 голосов
/ 19 октября 2018

Я пишу индикатор приложения в Ubuntu 18.04.Начало было самой сложной частью.Документы мало помогают.Я нашел этот блог , и у меня есть POC, который просто показывает фиксированный текст на панели приложения, как это -
enter image description here
Что я не смогвыяснить, как обновлять этот текст периодически или динамически для отображения фактической информации, которая мне нужна, например: частота процессора, температура и т. д.

Я посмотрел в следующих местах, однако я думаю,я что-то упускаю.
https://lazka.github.io/pgi-docs/Gtk-3.0/classes/Label.html
https://askubuntu.com/questions/108035/writing-indicators-with-python-gir-and-gtk3
https://lazka.github.io/pgi-docs/AppIndicator3-0.1/classes/Indicator.html#AppIndicator3.Indicator.set_label

Рабочий код, который у меня есть, -

import os
import signal
from gi.repository import Gtk as gtk
from gi.repository import AppIndicator3 as appindicator

APPINDICATOR_ID = 'myappindicator'

def main():
    indicator = appindicator.Indicator.new(APPINDICATOR_ID, gtk.STOCK_INFO, appindicator.IndicatorCategory.SYSTEM_SERVICES)
    indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
    indicator.set_menu(build_menu())
    indicator.set_label('world', '8.8')
    gtk.main()

def build_label():
    label = gtk.Label()
    return label

def build_menu():
    menu = gtk.Menu()
    item_quit = gtk.MenuItem('Quit')
    item_quit.connect('activate', quit)
    menu.append(item_quit)
    menu.show_all()
    return menu

def quit(source):
    gtk.main_quit()

if __name__ == "__main__":
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    main()

РЕДАКТИРОВАТЬ:
Ссылаясь на этот аналогичный пост SO, и этот явно работающий пример, я попытался добавить timeout_add_seconds и timeout_add, однако текст невообще не меняется, отображается только первый звонок.Я также вставил туда инструкцию print, и, что удивительно, он также печатает только один раз .Не знаю, почему это происходит -
Новая попытка кода -

import random
from gi.repository import Gtk, GLib
from gi.repository import AppIndicator3 as appindicator

APPINDICATOR_ID = 'myappindicator'

def cb_exit(w, data):
   Gtk.main_quit()

def change_label(ind_app):
    text = 'Hello World, what a great day'.split()
    t = random.choice(text)
    print(t)
    ind_app.set_label(t , '')

ind_app = appindicator.Indicator.new(APPINDICATOR_ID, Gtk.STOCK_INFO, appindicator.IndicatorCategory.SYSTEM_SERVICES)
ind_app.set_status(appindicator.IndicatorStatus.ACTIVE)

# create a menu
menu = Gtk.Menu()
menu_items = Gtk.MenuItem("Exit")
menu.append(menu_items)
menu_items.connect("activate", cb_exit, '')
menu_items.show_all()
ind_app.set_menu(menu)
GLib.timeout_add(1000, change_label, ind_app)
Gtk.main()

1 Ответ

0 голосов
/ 19 октября 2018

Я понял это сам.Я неправильно использовал функцию timeout_add.Вызванная функция должна возвращать все, что не ложно, чтобы таймер продолжал работу.В моем случае он ничего не возвращает, поэтому таймер сам себя разрушал. документы здесь и этот ТАК пост помогли мне понять это.ТАК код наконец выглядит так -

import random
from gi.repository import Gtk, GLib
from gi.repository import AppIndicator3 as appindicator

APPINDICATOR_ID = 'myappindicator'

def change_label(ind_app):
    text = 'Hello world, what a beautiful day'.split()
    t = random.choice(text)
    print(t)
    ind_app.set_label(t , '')
    return True

def quit(source):
    Gtk.main_quit()

ind_app = appindicator.Indicator.new(APPINDICATOR_ID, Gtk.STOCK_INFO, appindicator.IndicatorCategory.SYSTEM_SERVICES)
ind_app.set_status(appindicator.IndicatorStatus.ACTIVE)

# create a menu
menu = Gtk.Menu()
menu_items = Gtk.MenuItem("Exit")
menu.append(menu_items)
menu_items.connect("activate", quit)
menu_items.show_all()
ind_app.set_menu(menu)
GLib.timeout_add(1000, change_label, ind_app)
Gtk.main()
...