Fuzzy-Clock für Ubuntu

9

Vor langer Zeit hatte ich eine Uhr eingestellt, um Dinge wie Morgen, Tag, Abend, Nacht für die Zeit in einer Panel-App zu sagen. Breiter Strich, nicht sehr spezifisch. Es könnte sich um einen KDE-Desktop handeln. Ich bin jetzt in Ubuntu Mate. Gibt es eine Möglichkeit, diese vage Zeitbeschreibung im Mate-Panel abzurufen?

j0h
quelle
1
Wenn es hilft, wird dies eine Fuzzy-Uhr genannt
Dmiters
Es hilft. :)
j0h
1
Hier ist der Quellcode: code.google.com/archive/p/fuzzy-clock Jetzt brauchen wir @jacobvlijm, um daraus eine App zu machen>: - D
Rinzwind
Ich habe angefangen, Mate-University zu lesen, um Panel-Apps zu erstellen. Ich bin mir sicher, dass ich so etwas programmieren kann, aber ich habe keine Ahnung, wie ich daraus eine Panel-App machen kann
j0h
1
Ich bin mir sicher, dass dies in KDE war und auch übersetzt wurde!
Antek

Antworten:

15

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 Unityund Mateund (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

    Geben Sie hier die Bildbeschreibung ein

  • Zeigen Sie den textuellen "Tagesbereich" ( Nacht , Morgen , Tag , Abend ).

    Geben Sie hier die Bildbeschreibung ein

  • Show am / pm

    Geben Sie hier die Bildbeschreibung ein

  • Zeigen Sie alle auf einmal (oder eine beliebige Kombination der drei)

    Geben Sie hier die Bildbeschreibung ein

  • Sprechen Sie die Zeit jede Viertelstunde aus ( espeakerforderlich)

  • 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:

Geben Sie hier die Bildbeschreibung ein

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.pyzusammen 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.pyzusammen 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

  1. Das Skript benötigt espeak:

    sudo apt-get install espeak
    
  2. 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

  3. Definieren Sie im Kopf des Skripts ( moderntimes.py), welche Informationen wie angezeigt werden sollen. Einfach einstellen Trueoder Falsein 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
  4. 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 :)

  5. 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".

    Geben Sie hier die Bildbeschreibung ein

  6. 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 midnightzB:

      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 :Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Wie bereits erwähnt, wurde diese Version auf beide getestet Mate(von der ursprünglichen Frage) Unityund Xubuntu.

Geben Sie hier die Bildbeschreibung ein

Jacob Vlijm
quelle
1
Ich würde sagen: Fuzzy bedeutet, dass Sie ungenau sein können. Also 15:12 bis 15:23 oder so wäre Viertel nach 3. Ich würde sagen, verwenden Sie einfach: 5/10 / Viertel / halb nach / bis Stunde. Es heißt nicht umsonst Fuzzy.
Rinzwind
Noch eine tolle Antwort. Ich hoffe das wird in deine PPA integriert .... :)
Parto
@Parto wow danke nochmal :) Ich werde definitiv einen ppa für diesen erstellen :)
Jacob Vlijm
1

Wenn Sie Kubuntu (Plasma Desktop Ubuntu Distribution) haben, haben Sie ein eingebautes Widget namens "Fuzzy Clock" - es gibt es mindestens seit 14.04 oder schon seit Plasma 4 und es ist immer noch in Plasma 5 wie in Kubuntu 16.04 gefunden.

Die Fuzzy-Uhr kann so eingestellt werden, dass sie in Schritten von fünf Minuten so genau ist wie das Lesen einer analogen Uhr (z. B. "zehn nach vier"). Sie verfügt jedoch auch über drei "unschärfere" Einstellungen, von denen eine Messwerte wie "Nachmittag" liefert. und eine, die nur "Wochenende!" (an einem Sonntagnachmittag - ich nehme an, es wird morgen "Montag" heißen).

Ich weiß nicht, ob die Fuzzy-Uhr in anderen Ubuntu-Varianten verfügbar ist - ich habe sie in xfce (wie in Xubuntu) auf meinem System gesehen, aber das Betriebssystem wurde als Kubuntu installiert, daher bin ich mir nicht sicher, ob die Fuzzy-Uhr verfügbar ist nativ für xfce sowie KDE / Plasma, noch ob es in Unity oder Mate verfügbar ist.

Zeiss Ikon
quelle