Horloge floue pour Ubuntu

9

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 l'heure dans une application de panneau. Large coup, pas très spécifique, Il aurait pu s'agir d'un bureau KDE. Je suis dans Ubuntu Mate maintenant, y a-t-il un moyen d'obtenir cette vague description du temps dans le panneau mate?

j0h
la source
1
si cela aide, cela s'appelle une horloge floue
Dmiters
Ça aide. :)
j0h
1
Voici le code source: code.google.com/archive/p/fuzzy-clock Maintenant, nous avons besoin de @jacobvlijm pour en faire une application>: - D
Rinzwind
J'ai commencé à lire Mate-University pour créer des applications de panneau. Je suis sûr que je peux programmer quelque chose comme ça, mais je n'ai aucune idée de comment en faire une application de panneau
j0h
1
c'était dans KDE, j'en suis sûr, et a été traduit aussi!
Antek

Réponses:

15

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 Unityet Mateet (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

    entrez la description de l'image ici

  • Afficher la "zone jour" textuelle ( nuit , matin , jour , soir )

    entrez la description de l'image ici

  • Spectacle am / pm

    entrez la description de l'image ici

  • Montrez-les tous à la fois (ou toute combinaison des trois)

    entrez la description de l'image ici

  • Dites le temps chaque quart d'heure ( espeakobligatoire)

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

entrez la description de l'image ici

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

  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, exactement nommé comme indiqué dans Le script, le module et une icône

  3. Dans la tête du script ( moderntimes.py), définissez quelles informations doivent être affichées et comment. Réglez simplement Trueou Falsedans 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. 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 :)

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

    entrez la description de l'image ici

  6. 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 :entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici

Comme mentionné, cette version a été testée à la fois Mate(à partir de la question d'origine) Unityet Xubuntu.

entrez la description de l'image ici

Jacob Vlijm
la source
1
Je dirais: flou signifie que vous pouvez être inexact. Donc, 15h12 à 15h23 serait environ trois heures et quart. Je dirais simplement utiliser: 5/10 / quart / demi-heure / heure. Ce n'est pas appelé flou pour rien.
Rinzwind
Encore une autre réponse impressionnante. J'espère que cela s'intègre dans votre PPA .... :)
Parto
@Parto wow merci encore :) Je vais certainement créer un ppa pour celui-ci :)
Jacob Vlijm
1

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

L'horloge floue peut être réglée pour être aussi «précise» que des incréments de cinq minutes, comme la lecture d'une horloge analogique (par exemple, «dix après quatre»), mais elle a également trois paramètres «plus flous», dont l'un donne des lectures comme «l'après-midi» et celui qui donne juste "Week-end!" (un dimanche après-midi - je suppose que ça dit "lundi" demain).

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

Zeiss Ikon
la source