Como eu faria um programa indicador simples para registrar timestamps?

1

Eu gostaria de fazer um botão para sentar ao lado dos meus indicadores de som / sem fio / etc que, quando alternados, mudam de cor e escrevem a hora do sistema com a palavra "begin" para um arquivo, quando alternados novamente , retorne à sua cor original e registre a hora do sistema com a palavra "end". Idealmente, o botão manteria seu estado alternado / desmarcado mesmo se o sistema reiniciava.

Eu não posso imaginar que este seria um programa difícil de fazer, mas eu sou um pouco novo no Ubuntu e não sei como fazer um programa funcionar como um indicador, ou como fazer algo manter o seu estado no reinício do sistema.

    
por Alexander Nikolas Gruber 24.06.2013 / 01:21

2 respostas

3

Eu me interessei, então aqui está o meu código em Python:

#!/usr/bin/python

from time import time, ctime
from gi.repository import Gtk
from gi.repository import AppIndicator3 as Indicator


MY_FILENAME = '/home/your-username/myfile.log'
MY_INDICATOR_ID = 'my-indicator-example'
STOP_ICON_NAME = 'indicator-messages'
START_ICON_NAME = 'indicator-messages-new'

class MyIndicator(object):

    def __init__(self, filename):
        self.indicator = Indicator.Indicator.new(
                                MY_INDICATOR_ID,
                                STOP_ICON_NAME,
                                Indicator.IndicatorCategory.APPLICATION_STATUS)

        self.indicator.set_status(Indicator.IndicatorStatus.ACTIVE)
        self.indicator.set_attention_icon(START_ICON_NAME)

        self.has_started = False

        self.menu = Gtk.Menu()

        start_item = Gtk.MenuItem('Start')
        start_item.connect('activate', self.start_activated, filename)
        self.menu.append(start_item)
        start_item.show()

        stop_item = Gtk.MenuItem('Stop')
        stop_item.connect('activate', self.stop_activated, filename)
        self.menu.append(stop_item)
        stop_item.show()

        self.indicator.set_menu(self.menu)

    def main(self):
        Gtk.main()

    def start_activated (self, menu_item, filename):
        if not self.has_started:
            myfile = open(filename, 'a')
            myfile.write('Start  <%s>\n' % ctime(time()))
            self.indicator.set_status(Indicator.IndicatorStatus.ATTENTION)
            self.has_started = True

    def stop_activated (self, menu_item, filename):
        if self.has_started:
            myfile = open(filename, 'a')
            myfile.write('End    <%s>\n' % ctime(time()))
            self.indicator.set_status(Indicator.IndicatorStatus.ACTIVE)
            self.has_started = False


if __name__ == '__main__':
    indicator = MyIndicator(MY_FILENAME)
    indicator.main()

Eu usei as informações fornecidas por gpaste-indicator e o Ubuntu Wiki . Não tenho certeza sobre o recurso "manter o estado entre reinicializações", o mais simples seria ler a última linha de myfile.log e definir self.has_started de acordo. Boa sorte.

    
por edwin 24.06.2013 / 03:30
3

Consegui modificar e melhorar o código a partir da resposta muito útil do edwin para que o aplicativo mantenha o estado entre as reinicializações! Eu estou usando isso o tempo todo agora.

Para qualquer outra pessoa que queira usá-lo, aqui está (também disponível em pastebin ):

#!/usr/bin/python

from time import time, ctime
from gi.repository import Gtk
from gi.repository import AppIndicator3 as Indicator
from datetime import datetime, date


MY_FILENAME = '/home/anotherghost/workhours.log'
MY_INDICATOR_ID = 'work-hours-indicator'
STOP_ICON_NAME = 'indicator-messages'
START_ICON_NAME = 'indicator-messages-new'
FMT = "%a %b %d %H:%M:%S %Y"

class MyIndicator(object):

    def __init__(self, filename):
        self.indicator = Indicator.Indicator.new(
                                MY_INDICATOR_ID,
                                STOP_ICON_NAME,
                                Indicator.IndicatorCategory.APPLICATION_STATUS)

        self.menu = Gtk.Menu()

        start_item = Gtk.MenuItem('Start')
        start_item.connect('activate', self.start_activated, filename)
        self.menu.append(start_item)
        start_item.show()

        stop_item = Gtk.MenuItem('Stop')
        stop_item.connect('activate', self.stop_activated, filename)
        self.menu.append(stop_item)
        stop_item.show()

        showall_item = Gtk.MenuItem('Show all')
        showall_item.connect('activate', self.showall, filename)
        self.menu.append(showall_item)
        showall_item.show()

        self.indicator.set_menu(self.menu)
        self.indicator.set_attention_icon(START_ICON_NAME)

        with open(MY_FILENAME,'r') as fn:
            try:
                fn.seek(-70, 2)
            except (IndexError, IOError):
                fn.seek(max(-len(fn.read().decode()),-69),2)
            self.last = fn.readlines()[-1].decode()
            if len(self.last) > 1 and len(self.last) < 30:
                self.last = self.last.split(" ")
                self.last[-1] = self.last[-1][:4]
                self.last = " ".join(self.last)
                self.start_time = datetime.strptime(self.last, FMT)
                self.indicator.set_status(Indicator.IndicatorStatus.ATTENTION)
                self.has_started = True
                self.end_time = datetime.now()
            else:
                self.indicator.set_status(Indicator.IndicatorStatus.ACTIVE)
                self.has_started = False
                self.start_time = datetime.now()
                self.end_time = datetime.now()


    def main(self):
        Gtk.main()

    def start_activated (self, menu_item, filename):
        if not self.has_started:
            myfile = open(filename, 'a')
            self.start_time = datetime.now()
            myfile.write('%s' % self.start_time.strftime(FMT))
            self.indicator.set_status(Indicator.IndicatorStatus.ATTENTION)
            self.has_started = True
            myfile.close()

    def stop_activated (self, menu_item, filename):
        if self.has_started:
            myfile = open(filename, 'r+')
            myfile.seek(-1, 2)
            if myfile.read(1) == '\n':
                myfile.seek(-1, 2)
            self.end_time = datetime.now()
            self.elapsed_time = self.end_time - self.start_time
            myfile.write('\t%s\t' % self.end_time.strftime(FMT))
            myfile.write('%s\n' % round(float(self.elapsed_time.seconds)/3600,3) )
            self.indicator.set_status(Indicator.IndicatorStatus.ACTIVE)
            self.has_started = False
            myfile.close()

    def showall (self, menu_item, filename):
        myfile = open('op.log', 'a')
        myfile.write('has_started: %s\n' % self.has_started)
        myfile.write('start_time: %s\n' % self.start_time.strftime(FMT))
        myfile.write('end_time: %s\n' % self.end_time.strftime(FMT))


if __name__ == '__main__':
    indicator = MyIndicator(MY_FILENAME)
    indicator.main()
    
por Alexander Nikolas Gruber 14.07.2013 / 01:39