Fuzzy-Clock per Ubuntu


9

Molto tempo fa, avevo un orologio impostato per dire cose come mattina, giorno, sera, notte, per l'ora in un'app pannello. Colpo largo, non molto specifico, potrebbe essere stato un desktop KDE. Sono in Ubuntu Mate ora, c'è un modo per ottenere questa vaga descrizione del tempo nel pannello di accoppiamento?


1
se aiuta, questo si chiama orologio fuzzy
Dmiters il

Aiuta. :)
j0h

1
Ecco il codice sorgente: code.google.com/archive/p/fuzzy-clock Ora abbiamo bisogno di @jacobvlijm per trasformarlo in un'app>: - D
Rinzwind

Ho iniziato a leggere Mate-University per creare app per pannelli. Sono sicuro di poter programmare qualcosa del genere, ma non ho idea di come renderlo un'app pannello
j0h

1
questo era in KDE, ne sono sicuro, ed è stato tradotto anche!
Antek,

Risposte:


15

Orologio testuale / parlante per Mate e altre varianti di Ubuntu

Sebbene la domanda fosse originariamente su Ubuntu Mate , per fortuna, a partire dal 15.10, anche gli indicatori possono essere utilizzati Mate. Di conseguenza, la risposta di seguito funziona almeno per Unitye Matee (testato) su Xubuntu.

Una GUI per modificare le impostazioni deve ancora seguire (lavorando su di essa), ma ho testato l'indicatore di seguito per almeno 20 ore e (come previsto) ha fatto il lavoro senza errori.

Opzioni

L'indicatore offre le seguenti opzioni:

  • Mostra l'ora testuale

    inserisci qui la descrizione dell'immagine

  • Mostra la "zona giorno" testuale ( notte , mattina , giorno , sera )

    inserisci qui la descrizione dell'immagine

  • Mostra am / pm

    inserisci qui la descrizione dell'immagine

  • Mostra tutti in una volta (o qualsiasi combinazione dei tre)

    inserisci qui la descrizione dell'immagine

  • Pronunciare il tempo ogni quarto d'ora ( espeakrichiesto)

  • Facoltativamente, l'ora viene visualizzata in modo sfocato ; arrotondato per cinque minuti, ad esempio
    10:43 -> quarter to eleven.

Lo script, il modulo e un'icona

La soluzione esiste di uno script, un modulo separato e un'icona, che è necessario archiviare nella stessa directory .

L'icona:

inserisci qui la descrizione dell'immagine

Fai clic destro su di esso e salvalo come (esattamente) indicator_icon.png

Il modulo:

Questo è il modulo che produce l'ora testuale e tutte le altre informazioni visualizzate. Copia il codice, salvalo come (di nuovo, esattamente ) tcalc.py, insieme all'icona sopra nella stessa directory .

#!/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]

Il copione:

Questo è l'indicatore reale. Copia il codice, salvalo come moderntimes.py, insieme all'icona e al modulo sopra nella stessa directory .

#!/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()

Come usare

  1. La sceneggiatura ha bisogno di espeak:

    sudo apt-get install espeak
    
  2. Copia tutti e tre i file sopra nella stessa directory, identificati esattamente come indicato in Lo script, il modulo e un'icona

  3. Nell'intestazione dello script ( moderntimes.py), definire quali informazioni devono essere visualizzate e come. Basta impostare Trueo Falsenella riga:

    # --- 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. In testa al modulo , puoi cambiare l'orario in cui iniziare successivamente mattina , giorno , sera , notte , nella linea:

    # --- set starttime of morning, day, evening, night (whole hrs)
    limits = [6, 9, 18, 21]
    # ---
    

    Non toccare nient'altro nella sceneggiatura per ora :)

  5. Gli utenti di Ubuntu Mate devono abilitare l'uso degli indicatori sul proprio sistema: scegliere Sistema> Preferenze> Aspetto> Mate tweak> Interfaccia> "Abilita indicatori"

    inserisci qui la descrizione dell'immagine

  6. Esegui l'indicatore con il comando:

    python3 /path/to/moderntimes.py
    

Eseguendolo da applicazioni di avvio

Ricorda che se esegui il comando da Startup Applications, in molti casi devi aggiungere una piccola pausa, specialmente (tra gli altri) sugli indicatori:

/bin/bash -c "sleep 15 && python3 /path/to/moderntimes.py"

Appunti

  • Senza dubbio lo script verrà modificato / aggiornato nei prossimi giorni molte volte. Una cosa su cui vorrei un feedback in particolare è lo "stile" in cui il tempo digitale viene convertito in tempo testuale. Il modo in cui è fatto ora:

    • ore intere, ad es .:

      six o'clock
      
    • meno di 30 minuti dopo l'ora, ad es

      twenty past eleven
      
    • 30 minuti dopo l'ora, ad es .:

      half past five
      
    • più i 30 minuti ad esempio:

      twenty to five
      
    • Sono indicati 15 minuti quarter, ad esempio:

      quarter past six
      
    • l'eccezione è la mezzanotte, che non viene chiamata zero, ma midnight, ad esempio:

      quarter past midnight
      
  • Lo script ha un consumo estremamente basso, a causa del fatto che dopo il primo timececk-loop, il loop si sincronizza automaticamente sull'orologio del computer. Pertanto lo script controlla il tempo / modifica il tempo visualizzato solo una volta al minuto, dormendo il resto del tempo.


modificare

Ad oggi (2016-4-9), è disponibile un ppa di una versione lucidata. Per installare da ppa:

sudo apt-add-repository ppa:vlijm/abouttime
sudo apt-get update
sudo apt-get install abouttime

I periodi di giorno in questa versione sono cambiati, rispetto alla versione di script sopra, ora è:

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

... e l'indicatore ha l'opzione di cambiare l'icona durante il giorno:
mattina / pomeriggio / sera / notte :inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Come accennato, questa versione è stata testata su entrambi Mate(dalla domanda originale) Unitye Xubuntu.

inserisci qui la descrizione dell'immagine


1
Direi: fuzzy significa che puoi essere impreciso. Quindi dalle 15:12 alle 15:23 o giù di lì sarebbero le tre e un quarto. Direi solo usare: 5/10 / quarter / half past / to hour. Non si chiama fuzzy per niente.
Rinzwind

Ancora un'altra risposta fantastica. Spero che questo venga integrato nel tuo PPA .... :)
Parto

@Pow wow grazie ancora :) Creerò sicuramente un ppa per questo :)
Jacob Vlijm

1

Se hai Kubuntu (distro Ubuntu desktop Plasma), hai un widget incorporato chiamato "orologio fuzzy" - è in circolazione almeno dal 14.04, o fino a quando Plasma 4 è uscito ed è ancora in Plasma 5 come si trova in Kubuntu 16.04.

Fuzzy Clock può essere impostato come "preciso" come incrementi di cinque minuti, come leggere un orologio analogico (diciamo "dieci dopo quattro"), ma ha anche tre impostazioni "fuzzier", una delle quali fornisce letture come "pomeriggio" e uno che dà solo "Weekend!" (di domenica pomeriggio - suppongo che domani dirà "lunedì").

Non so se l'orologio fuzzy è disponibile in altre versioni di Ubuntu - l'ho visto in xfce (come si trova in Xubuntu) sul mio sistema, ma il sistema operativo è stato installato come Kubuntu, quindi non sono sicuro che l'orologio fuzzy sia nativo di xfce e KDE / Plasma, né se è disponibile in Unity o Mate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.