Reloj textual / parlante para Mate y otras variantes de Ubuntu
Aunque la pregunta era originalmente sobre Ubuntu Mate , afortunadamente, desde 15.10, los indicadores también se pueden usar Mate
. Como resultado, la respuesta a continuación al menos funciona para Unity
y Mate
y (probado) en Xubuntu
.
Todavía debe seguir una GUI para cambiar la configuración (trabajando en ella), pero probé el indicador a continuación durante al menos 20 horas y (como se esperaba) hizo el trabajo sin error.
Opciones
El indicador ofrece las siguientes opciones:
Mostrar el tiempo textual
Mostrar el "área de día" textual ( noche , mañana , día , tarde )
Mostrar am / pm
Muéstralas todas a la vez (o cualquier combinación de las tres)
Hable el tiempo cada cuarto de hora ( espeak
requerido)
Opcionalmente, la hora se muestra difusa ; redondeado en cinco minutos, p. ej.
10:43 -> quarter to eleven
.
El script, el módulo y un ícono
La solución existe de un script, un módulo separado y un ícono, que debe almacenar en el mismo directorio .
El icono:
Haga clic derecho sobre él y guárdelo como (exactamente) indicator_icon.png
El módulo:
Este es el módulo que produce el tiempo textual y toda la información mostrada. Copie el código, guárdelo como (nuevamente, exactamente ) tcalc.py
, junto con el icono de arriba en el mismo directorio .
#!/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]
La secuencia de comandos:
Este es el indicador real. Copie el código, guárdelo como moderntimes.py
, junto con el icono y el módulo anterior en uno y el mismo directorio .
#!/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()
Cómo utilizar
El script necesita espeak
:
sudo apt-get install espeak
Copie los tres archivos anteriores en un mismo directorio, exactamente nombrado como se indica en El script, el módulo y un icono
En el encabezado del script ( moderntimes.py
), defina qué información debe mostrarse y cómo. Simplemente configure True
o False
en la línea:
# --- 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
En la cabecera del módulo , puede cambiar las horas en que comenzará posteriormente mañana , día , tarde , noche , en la línea:
# --- set starttime of morning, day, evening, night (whole hrs)
limits = [6, 9, 18, 21]
# ---
No toques nada más en el script por ahora :)
Los usuarios de Ubuntu Mate deben habilitar el uso de indicadores en su sistema: seleccione Sistema> Preferencias> Apariencia> Ajuste de Mate> Interfaz> "Habilitar indicadores"
Ejecute el indicador con el comando:
python3 /path/to/moderntimes.py
Ejecutarlo desde aplicaciones de inicio
Recuerde que si ejecuta el comando desde Aplicaciones de inicio, en muchos casos necesita agregar un pequeño descanso, especialmente (entre otros) en los indicadores:
/bin/bash -c "sleep 15 && python3 /path/to/moderntimes.py"
Notas
Sin duda, el script se cambiará / actualizará en los próximos días muchas veces. Una cosa sobre la que me gustaría recibir comentarios en particular es el "estilo" en el que el tiempo digital se convierte en tiempo textual. La forma en que se hace ahora:
horas enteras, por ejemplo:
six o'clock
menos de 30 minutos después de la hora, p. ej.
twenty past eleven
30 minutos después de la hora, por ejemplo:
half past five
más los 30 minutos, por ejemplo:
twenty to five
Se mencionan 15 minutos quarter
, por ejemplo:
quarter past six
la excepción es medianoche, que no se llama zero
, pero midnight
, por ejemplo:
quarter past midnight
El script es extremadamente bajo en jugo, debido al hecho de que después del primer bucle de verificación de tiempo, el bucle se sincroniza automáticamente en el reloj de la computadora. Por lo tanto, el script comprueba el tiempo / edita el tiempo mostrado solo una vez por minuto, durmiendo el resto del tiempo.
Editar
Según hoy (2016-4-9), se encuentra disponible un ppa de una versión pulida. Para instalar desde ppa:
sudo apt-add-repository ppa:vlijm/abouttime
sudo apt-get update
sudo apt-get install abouttime
Los períodos de días en esta versión cambian, en comparación con la versión de script anterior, ahora es:
morning 6:00-12:00
afternoon 12:00-18:00
evening 18:00-24:00
night 24:00-6:00
... y el indicador tiene la opción de cambiar el ícono durante el día:
mañana / tarde / tarde / noche :
Como se mencionó, esta versión se probó tanto en Mate
(de la pregunta original) Unity
como en Xubuntu
.