web-dev-qa-db-fra.com

Fuzzy-Clock pour Ubuntu

Il y a longtemps, j'avais une horloge réglée pour dire des choses comme le matin, le jour, le soir, la nuit, pour le temps passé dans une application de panneau. Un trait large, pas très spécifique, c’était peut-être un bureau KDE. Je suis dans Ubuntu Mate maintenant, y a-t-il un moyen d'obtenir cette description temporelle vague dans le panneau des partenaires?

9
j0h

Horloge textuelle/parlante pour Mate et autres variantes d'Ubuntu

Bien que la question concernait à l'origine Ubuntu Mate , heureusement, à partir de 15.10, les indicateurs peuvent être utilisés sur Mate aussi bien. En conséquence, la réponse ci-dessous au moins fonctionne pour Unity et Mate et (testé) sur Xubuntu.

Une interface graphique pour modifier les paramètres reste à suivre (mais elle est opérationnelle), mais j’ai testé l’indicateur ci-dessous pendant au moins 20 heures et (comme prévu), il a effectué le travail sans erreur.

Les options

L'indicateur offre les options suivantes:

  • Afficher le temps textuel

    enter image description here

  • Afficher le texte "zone jour" ( nuit , matin , jour , soir )

    enter image description here

  • Show a.m./p.m.

    enter image description here

  • Montre-les tous en même temps (ou n'importe quelle combinaison des trois)

    enter image description here

  • Prononcez le temps chaque trimestre d'une heure (espeak requis)

  • Eventuellement, l'heure est affichée fuzzy ; arrondi sur cinq minutes, par exemple.
    10:43 -> quarter to eleven.

Le script, le module et une icône

La solution consiste en un script, un module séparé et une icône, que vous devez stocker dans un seul et même répertoire .

L'icône:

enter image description here

Faites un clic droit dessus et enregistrez-le sous (exactement) indicator_icon.png

Le module:

C'est le module qui produit l'heure textuelle et toutes les autres informations affichées. Copiez le code, enregistrez-le comme (encore une fois, exactement ) tcalc.py, ainsi que l’icône ci-dessus dans un 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 script:

C'est l'indicateur réel. Copiez le code, enregistrez-le sous le nom moderntimes.py, avec 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

  1. Le script a besoin de espeak:

    Sudo apt-get install espeak
    
  2. Copiez les trois fichiers ci-dessus dans un seul et même répertoire, nommé exactement comme indiqué dans Le script, le module et une icône

  3. Dans l'en-tête du script (moderntimes.py), définissez quelles informations doivent être affichées et comment. Définissez 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
    
  4. En tête du module , vous pouvez modifier les heures de démarrage ultérieur 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 :)

  5. Les utilisateurs Ubuntu Mate doivent pouvoir utiliser les indicateurs sur leur système: sélectionnez Système> Préférences> Apparence> Mate Tweak> Interface> "Activer les indicateurs".

    enter image description here

  6. Exécutez l'indicateur avec la commande:

    python3 /path/to/moderntimes.py
    

l'exécuter à partir d'applications de démarrage

N'oubliez pas que si vous exécutez la commande à partir d'applications de démarrage, vous devez souvent 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 au cours des prochains jours. Une des choses sur lesquelles j'aimerais particulièrement des commentaires est le "style" dans lequel l'heure numérique est convertie en heure textuelle. La façon dont c'est fait maintenant:

    • heures entières, par exemple:

      six o'clock
      
    • moins de 30 minutes après l'heure, par ex.

      twenty past eleven
      
    • 30 minutes après l'heure, par exemple:

      half past five
      
    • plus de 30 minutes, par exemple:

      twenty to five
      
    • 15 minutes sont mentionnées quarter, par exemple:

      quarter past six
      
    • exception est minuit, qui ne s'appelle pas zero, mais midnight, par exemple:

      quarter past midnight
      
  • Le script est extrêmement peu chargé, car après la première boucle timecheck, la boucle est automatiquement synchronisée sur l'horloge de l'ordinateur. Par conséquent, le script vérifie l'heure/édite l'heure affichée une fois par minute, en attendant le reste du temps.


Modifier

En date d'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 jours dans cette version sont modifiées par rapport à la version de script ci-dessus, elle est maintenant:

morning 6:00-12:00
afternoon 12:00-18:00
evening 18:00-24:00
night 24:00-6:00

... et l'indicateur a l'option de changer l'icône pendant la journée:
matin/après-midi/soir/nuit : enter image description hereenter image description hereenter image description hereenter image description here

Comme mentionné, cette version a été testée sur Mate (de la question initiale) Unity et Xubuntu.

enter image description here

15
Jacob Vlijm

Si vous avez Kubuntu (distribution Plasma Desktop Ubuntu), vous avez un widget intégré appelé "horloge floue" - il existe depuis au moins 14.04 heures, ou depuis que Plasma 4 est sorti et il est toujours dans Plasma 5. comme dans Kubuntu 16.04.

Fuzzy Clock peut être réglé pour être aussi "précis" que des incréments de cinq minutes, comme pour lire une horloge analogique (par exemple, "dix après quatre"), mais il possède également trois réglages "plus flous", dont l'un donne les lectures telles que "après-midi". et celui qui donne juste "Weekend!" (un dimanche après-midi - je suppose que ça dira "lundi" demain).

Je ne sais pas si l'horloge floue est disponible dans d'autres versions d'Ubuntu - je l'ai vue dans xfce (comme dans Xubuntu) sur mon système, mais le système d'exploitation a été installé en tant que Kubuntu. Je ne suis donc pas sûr que l'horloge floue soit natif de xfce ainsi que de KDE/Plasma, qu'il soit disponible dans Unity ou Mate.

1
Zeiss Ikon