Orologio testuale / parlante per Mate e altre varianti di Ubuntu
Sebbene la domanda fosse originariamente su Ubuntu Mate , per fortuna, a partire dal 15.10, anche gli indicatori possono essere utilizzati Mate. Di conseguenza, la risposta di seguito funziona almeno per Unitye Matee (testato) su Xubuntu.
Una GUI per modificare le impostazioni deve ancora seguire (lavorando su di essa), ma ho testato l'indicatore di seguito per almeno 20 ore e (come previsto) ha fatto il lavoro senza errori.
Opzioni
L'indicatore offre le seguenti opzioni:
Mostra l'ora testuale

Mostra la "zona giorno" testuale ( notte , mattina , giorno , sera )

Mostra am / pm

Mostra tutti in una volta (o qualsiasi combinazione dei tre)

Pronunciare il tempo ogni quarto d'ora ( espeakrichiesto)
Facoltativamente, l'ora viene visualizzata in modo sfocato ; arrotondato per cinque minuti, ad esempio
10:43 -> quarter to eleven.
Lo script, il modulo e un'icona
La soluzione esiste di uno script, un modulo separato e un'icona, che è necessario archiviare nella stessa directory .
L'icona:

Fai clic destro su di esso e salvalo come (esattamente) indicator_icon.png
Il modulo:
Questo è il modulo che produce l'ora testuale e tutte le altre informazioni visualizzate. Copia il codice, salvalo come (di nuovo, esattamente ) tcalc.py, insieme all'icona sopra nella stessa directory .
#!/usr/bin/env python3
import time
# --- set starttime of morning, day, evening, night (whole hrs)
limits = [6, 9, 18, 21]
# ---
periods = ["night", "morning", "day", "evening", "night"]
def __fig(n):
singles = [
"midnight", "one", "two", "three", "four", "five", "six",
"seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen",
"fourteen", "quarter", "sixteen", "seventeen", "eighteen", "nineteen",
]
tens = ["twenty", "half"]
if n < 20:
return singles[n]
else:
if n%10 == 0:
return tens[int((n/10)-2)]
else:
fst = tens[int(n/10)-2]
lst = singles[int(str(n)[-1])]
return fst+"-"+lst
def __fuzzy(currtime):
minutes = round(currtime[1]/5)*5
if minutes == 60:
currtime[1] = 0
currtime[0] = currtime[0] + 1
else:
currtime[1] = minutes
currtime[0] = 0 if currtime[0] == 24 else currtime[0]
return currtime
def textualtime(fuzz):
currtime = [int(n) for n in time.strftime("%H %M %S").split()]
currtime = __fuzzy(currtime) if fuzz == True else currtime
speak = True if currtime[1]%15 == 0 else False
period = periods[len([n for n in limits if currtime[0] >= n])]
# define a.m. / p.m.
if currtime[0] >= 12:
daytime = "p.m."
if currtime[0] == 12:
if currtime[1] > 30:
currtime[0] = currtime[0] - 12
else:
currtime[0] = currtime[0] - 12
else:
daytime = "a.m."
# convert time to textual time
if currtime[1] == 0:
t = __fig(currtime[0])+" o'clock" if currtime[0] != 0 else __fig(currtime[0])
elif currtime[1] > 30:
t = __fig((60 - currtime[1]))+" to "+__fig(currtime[0]+1)
else:
t = __fig(currtime[1])+" past "+__fig(currtime[0])
return [t, period, daytime, currtime[2], speak]
Il copione:
Questo è l'indicatore reale. Copia il codice, salvalo come moderntimes.py, insieme all'icona e al modulo sopra nella stessa directory .
#!/usr/bin/env python3
import os
import signal
import subprocess
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, AppIndicator3, GObject
import time
from threading import Thread
import tcalc
# --- define what to show:
# showtime = textual time, daytime = a.m./p.m. period = "night"/"morning"/day"/"evening"
# speak = speak out time every quarter, fuzzy = round time on 5 minutes
showtime = True; daytime = False; period = True; speak = True; fuzzy = True
class Indicator():
def __init__(self):
self.app = 'about_time'
path = os.path.dirname(os.path.abspath(__file__))
self.indicator = AppIndicator3.Indicator.new(
self.app, os.path.abspath(path+"/indicator_icon.png"),
AppIndicator3.IndicatorCategory.OTHER)
self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
self.indicator.set_menu(self.create_menu())
self.update = Thread(target=self.get_time)
self.update.setDaemon(True)
self.update.start()
def get_time(self):
# the first loop is 0 seconds, the next loop is 60 seconds,
# in phase with computer clock
loop = 0; timestring1 = ""
while True:
time.sleep(loop)
tdata = tcalc.textualtime(fuzzy)
timestring2 = tdata[0]
loop = (60 - tdata[3])+1
mention = (" | ").join([tdata[item[1]] for item in [
[showtime, 0], [period, 1], [daytime, 2]
]if item[0] == True])
if all([
tdata[4] == True,
speak == True,
timestring2 != timestring1,
]):
subprocess.Popen(["espeak", '"'+timestring2+'"', "-s", "130"])
# [4] edited
GObject.idle_add(
self.indicator.set_label,
mention, self.app,
priority=GObject.PRIORITY_DEFAULT
)
timestring1 = timestring2
def create_menu(self):
menu = Gtk.Menu()
item_quit = Gtk.MenuItem('Quit')
item_quit.connect('activate', self.stop)
menu.append(item_quit)
menu.show_all()
return menu
def stop(self, source):
Gtk.main_quit()
Indicator()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
Come usare
La sceneggiatura ha bisogno di espeak:
sudo apt-get install espeak
Copia tutti e tre i file sopra nella stessa directory, identificati esattamente come indicato in Lo script, il modulo e un'icona
Nell'intestazione dello script ( moderntimes.py), definire quali informazioni devono essere visualizzate e come. Basta impostare Trueo Falsenella riga:
# --- define what to show:
# time = textual time, daytime = a.m./p.m. period = "night"/"morning"/day"/"evening"
# speak = speak out time every quarter, fuzzy = round time on 5 minutes
showtime = True; daytime = False; period = True; speak = False; fuzzy = True
In testa al modulo , puoi cambiare l'orario in cui iniziare successivamente mattina , giorno , sera , notte , nella linea:
# --- set starttime of morning, day, evening, night (whole hrs)
limits = [6, 9, 18, 21]
# ---
Non toccare nient'altro nella sceneggiatura per ora :)
Gli utenti di Ubuntu Mate devono abilitare l'uso degli indicatori sul proprio sistema: scegliere Sistema> Preferenze> Aspetto> Mate tweak> Interfaccia> "Abilita indicatori"

Esegui l'indicatore con il comando:
python3 /path/to/moderntimes.py
Eseguendolo da applicazioni di avvio
Ricorda che se esegui il comando da Startup Applications, in molti casi devi aggiungere una piccola pausa, specialmente (tra gli altri) sugli indicatori:
/bin/bash -c "sleep 15 && python3 /path/to/moderntimes.py"
Appunti
Senza dubbio lo script verrà modificato / aggiornato nei prossimi giorni molte volte. Una cosa su cui vorrei un feedback in particolare è lo "stile" in cui il tempo digitale viene convertito in tempo testuale. Il modo in cui è fatto ora:
ore intere, ad es .:
six o'clock
meno di 30 minuti dopo l'ora, ad es
twenty past eleven
30 minuti dopo l'ora, ad es .:
half past five
più i 30 minuti ad esempio:
twenty to five
Sono indicati 15 minuti quarter, ad esempio:
quarter past six
l'eccezione è la mezzanotte, che non viene chiamata zero, ma midnight, ad esempio:
quarter past midnight
Lo script ha un consumo estremamente basso, a causa del fatto che dopo il primo timececk-loop, il loop si sincronizza automaticamente sull'orologio del computer. Pertanto lo script controlla il tempo / modifica il tempo visualizzato solo una volta al minuto, dormendo il resto del tempo.
modificare
Ad oggi (2016-4-9), è disponibile un ppa di una versione lucidata. Per installare da ppa:
sudo apt-add-repository ppa:vlijm/abouttime
sudo apt-get update
sudo apt-get install abouttime
I periodi di giorno in questa versione sono cambiati, rispetto alla versione di script sopra, ora è:
morning 6:00-12:00
afternoon 12:00-18:00
evening 18:00-24:00
night 24:00-6:00
... e l'indicatore ha l'opzione di cambiare l'icona durante il giorno:
mattina / pomeriggio / sera / notte :

Come accennato, questa versione è stata testata su entrambi Mate(dalla domanda originale) Unitye Xubuntu.
