Я хотел бы сделать кнопку, чтобы она сидела рядом с моими звуковыми / беспроводными / иными индикаторами, которые при переключении будут менять цвет и записывать системное время со словом «begin» в файл, а затем, когда переключатся снова вернитесь к исходному цвету и запишите системное время словом «конец». В идеале кнопка должна поддерживать состояние «включено» / выключено, даже если система перезагружается.
Я не могу себе представить, что эту программу вообще сложно создать, но я немного новичок в Ubuntu, и я не уверен, как заставить программу работать в качестве индикатора или заставить что-то поддерживать ее. состояние при перезагрузке системы.
Я заинтересовался, вот мой код на 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()
Я использовал информацию, предоставленную gpaste-Indicator и Ubuntu Wiki . Я не уверен насчет функции «сохранение состояния между перезапусками», проще всего было бы прочитать последнюю строку myfile.log
и установить self.has_started
соответственно. Удачи.
Мне удалось изменить и улучшить код, основываясь на очень полезном ответе Эдвина, так что приложение сохраняет состояние между перезапусками! Я использую его все время.
Для всех, кто хочет использовать его, вот оно (также доступно на 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()