Text- / Sprechuhr für Mate und andere Ubuntu-Varianten
Obwohl die Frage ursprünglich Ubuntu Mate betraf, können zum Glück ab 15.10 auch Indikatoren verwendet werden Mate
. Infolgedessen funktioniert die folgende Antwort zumindest für Unity
und Mate
und (getestet) weiter Xubuntu
.
Eine GUI zum Ändern der Einstellungen muss noch folgen (daran arbeiten), aber ich habe den unten stehenden Indikator mindestens 20 Stunden lang getestet und (wie erwartet) die Arbeit ohne Fehler ausgeführt.
Optionen
Der Indikator bietet folgende Optionen:
Zeigen Sie die Textzeit an
Zeigen Sie den textuellen "Tagesbereich" ( Nacht , Morgen , Tag , Abend ).
Show am / pm
Zeigen Sie alle auf einmal (oder eine beliebige Kombination der drei)
Sprechen Sie die Zeit jede Viertelstunde aus ( espeak
erforderlich)
Optional wird die Zeit unscharf angezeigt . auf fünf Minuten gerundet, zB
10:43 -> quarter to eleven
.
Das Skript, das Modul und ein Symbol
Die Lösung besteht aus einem Skript, einem separaten Modul und einem Symbol, die Sie in ein und demselben Verzeichnis speichern müssen .
Das Symbol:
Klicken Sie mit der rechten Maustaste darauf und speichern Sie es als (genau) indicator_icon.png
Das Modul:
Dies ist das Modul, das die Textzeit und alle anderen angezeigten Informationen erzeugt. Kopieren Sie den Code, speichern Sie ihn als (wieder genau ) tcalc.py
zusammen mit dem obigen Symbol in ein und demselben Verzeichnis .
#!/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]
Das Skript:
Dies ist der eigentliche Indikator. Kopieren Sie den Code, speichern Sie ihn moderntimes.py
zusammen mit dem Symbol und dem Modul oben in ein und demselben Verzeichnis .
#!/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()
Wie benutzt man
Das Skript benötigt espeak
:
sudo apt-get install espeak
Kopieren Sie alle drei oben genannten Dateien in ein und dasselbe Verzeichnis, das genau wie im Skript, im Modul und in einem Symbol angegeben benannt ist
Definieren Sie im Kopf des Skripts ( moderntimes.py
), welche Informationen wie angezeigt werden sollen. Einfach einstellen True
oder False
in die Zeile:
# --- 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
Im Kopf des Moduls können Sie die Stunden ändern, zu denen anschließend morgens , tagsüber , abends , nachts in der Zeile begonnen werden soll:
# --- set starttime of morning, day, evening, night (whole hrs)
limits = [6, 9, 18, 21]
# ---
Berühre vorerst nichts anderes im Skript :)
Benutzer von Ubuntu Mate müssen die Verwendung von Indikatoren auf ihrem System aktivieren: Wählen Sie "System"> "Einstellungen"> "Look and Feel"> "Mate-Optimierung"> "Benutzeroberfläche"> "Indikatoren aktivieren".
Führen Sie den Indikator mit dem folgenden Befehl aus:
python3 /path/to/moderntimes.py
Ausführen von Startanwendungen
Denken Sie daran, dass Sie in vielen Fällen, wenn Sie den Befehl über Startanwendungen ausführen, eine kleine Pause einlegen müssen, insbesondere (unter anderem) bei Indikatoren:
/bin/bash -c "sleep 15 && python3 /path/to/moderntimes.py"
Anmerkungen
Zweifellos wird das Skript in den nächsten Tagen viele Male geändert / aktualisiert. Eine Sache, zu der ich insbesondere Feedback geben möchte, ist der "Stil", in dem die digitale Zeit in Textzeit umgewandelt wird. So wie es jetzt gemacht wird:
ganze Stunden, zB:
six o'clock
weniger als 30 Minuten nach der Stunde, z
twenty past eleven
30 Minuten nach der vollen Stunde zB:
half past five
mehr die 30 Minuten zB:
twenty to five
15 Minuten werden erwähnt quarter
, zB:
quarter past six
Ausnahme ist Mitternacht, die nicht genannt wird zero
, aber midnight
zB:
quarter past midnight
Das Skript ist extrem saftarm, da die Schleife nach der ersten Zeitprüfschleife automatisch auf der Computeruhr synchronisiert wird. Daher überprüft das Skript die Zeit / bearbeitet die angezeigte Zeit nur einmal pro Minute und schläft den Rest der Zeit.
Bearbeiten
Ab heute (2016-4-9) ist ein ppa einer polierten Version verfügbar. So installieren Sie von ppa:
sudo apt-add-repository ppa:vlijm/abouttime
sudo apt-get update
sudo apt-get install abouttime
Die Tageszeiträume in dieser Version wurden im Vergleich zur obigen Skriptversion geändert. Jetzt ist es:
morning 6:00-12:00
afternoon 12:00-18:00
evening 18:00-24:00
night 24:00-6:00
... und die Anzeige hat die Möglichkeit, das Symbol tagsüber zu ändern:
morgens / nachmittags / abends / nachts :
Wie bereits erwähnt, wurde diese Version auf beide getestet Mate
(von der ursprünglichen Frage) Unity
und Xubuntu
.