Horloge textuelle / parlante pour Mate et d' autres variantes d'Ubuntu
Bien que la question concernait à l'origine Ubuntu Mate , heureusement, à partir du 15.10, les indicateurs peuvent également être utilisés Mate
. Par conséquent, la réponse ci-dessous fonctionne au moins pour Unity
et Mate
et (testée) sur Xubuntu
.
Une interface graphique pour modifier les paramètres reste à suivre (en travaillant dessus), mais j'ai testé l'indicateur ci-dessous pendant au moins 20 heures et (comme prévu), il a fait le travail sans erreur.
Les options
L'indicateur offre les options suivantes:
Afficher l'heure textuelle
Afficher la "zone jour" textuelle ( nuit , matin , jour , soir )
Spectacle am / pm
Montrez-les tous à la fois (ou toute combinaison des trois)
Dites le temps chaque quart d'heure ( espeak
obligatoire)
Facultativement, l'heure est affichée floue ; arrondi sur cinq minutes, par exemple
10:43 -> quarter to eleven
.
Le script, le module et une icône
La solution existe d'un script, d'un module séparé et d'une icône, que vous devez stocker dans un seul et même répertoire .
L'icône:
Faites un clic droit dessus et enregistrez-le sous (exactement) indicator_icon.png
Le module:
Il s'agit du module qui produit l'heure textuelle et toutes les autres informations affichées. Copiez le code, enregistrez-le sous (encore une fois, exactement ) tcalc.py
, avec l'icône ci-dessus dans un seul et même répertoire .
#!/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]
Le scénario:
Ceci est l'indicateur réel. Copiez le code, enregistrez-le sous moderntimes.py
, ainsi que l'icône et le module ci-dessus dans un même répertoire .
#!/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()
Comment utiliser
Le script a besoin de espeak
:
sudo apt-get install espeak
Copiez les trois fichiers ci-dessus dans un seul et même répertoire, exactement nommé comme indiqué dans Le script, le module et une icône
Dans la tête du script ( moderntimes.py
), définissez quelles informations doivent être affichées et comment. Réglez simplement True
ou False
dans la ligne:
# --- 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
Dans la tête du module , vous pouvez changer les heures auxquelles commencer par la suite matin , jour , soir , nuit , dans la ligne:
# --- set starttime of morning, day, evening, night (whole hrs)
limits = [6, 9, 18, 21]
# ---
Ne touchez à rien d'autre dans le script pour l'instant :)
Les utilisateurs d'Ubuntu Mate doivent activer l'utilisation d'indicateurs sur leur système: choisissez Système> Préférences> Apparence> Ajustement de Mate> Interface> "Activer les indicateurs"
Exécutez l'indicateur avec la commande:
python3 /path/to/moderntimes.py
L'exécuter à partir des applications de démarrage
N'oubliez pas que si vous exécutez la commande à partir des applications de démarrage, dans de nombreux cas, vous devez ajouter une petite pause, en particulier (entre autres) sur les indicateurs:
/bin/bash -c "sleep 15 && python3 /path/to/moderntimes.py"
Remarques
Nul doute que le script sera modifié / mis à jour plusieurs fois dans les prochains jours. Une chose que j'aimerais en particulier savoir, c'est le "style" dans lequel l'heure numérique est convertie en heure textuelle. La façon dont cela se fait maintenant:
heures entières, par exemple:
six o'clock
moins de 30 minutes après l'heure, par exemple
twenty past eleven
30 minutes après l'heure, par exemple:
half past five
plus les 30 minutes par exemple:
twenty to five
15 minutes sont mentionnées quarter
, par exemple:
quarter past six
l'exception est minuit, qui n'est pas appelé zero
, mais midnight
, par exemple:
quarter past midnight
Le script est extrêmement faible en jus, car après la première boucle de contrôle horaire, la boucle est synchronisée automatiquement sur l'horloge de l'ordinateur. Par conséquent, le script vérifie l'heure / ne modifie l'heure affichée qu'une fois par minute, en dormant le reste du temps.
Éditer
Selon aujourd'hui (2016-4-9), un ppa d'une version polie est disponible. Pour installer à partir de ppa:
sudo apt-add-repository ppa:vlijm/abouttime
sudo apt-get update
sudo apt-get install abouttime
Les périodes de jour dans cette version sont modifiées, par rapport à la version de script ci-dessus, maintenant c'est:
morning 6:00-12:00
afternoon 12:00-18:00
evening 18:00-24:00
night 24:00-6:00
... et l'indicateur a la possibilité de changer l'icône pendant la journée:
matin / après-midi / soir / nuit :
Comme mentionné, cette version a été testée à la fois Mate
(à partir de la question d'origine) Unity
et Xubuntu
.