Fuzzy-Clock para Ubuntu

9

Hace mucho tiempo, tenía un reloj configurado para decir cosas como mañana, día, tarde, noche, por hora en una aplicación de panel. Trazo amplio, no muy específico, podría haber sido un escritorio KDE. Ahora estoy en Ubuntu Mate, ¿hay alguna manera de obtener esta descripción vaga del tiempo en el panel de mate?

j0h
fuente
1
si ayuda, esto se llama un reloj borroso
Dmiters
Sí ayuda. :)
j0h
1
Aquí está el código fuente: code.google.com/archive/p/fuzzy-clock Ahora necesitamos @jacobvlijm para convertirlo en una aplicación>: - D
Rinzwind
Comencé a leer Mate-University para hacer aplicaciones de panel. Estoy seguro de que puedo programar algo como esto, pero no tengo idea de cómo convertirlo en una aplicación de panel
j0h
1
esto estaba en KDE, estoy seguro de esto, ¡y también fue traducido!
Antek

Respuestas:

15

Reloj textual / parlante para Mate y otras variantes de Ubuntu

Aunque la pregunta era originalmente sobre Ubuntu Mate , afortunadamente, desde 15.10, los indicadores también se pueden usar Mate. Como resultado, la respuesta a continuación al menos funciona para Unityy Matey (probado) en Xubuntu.

Todavía debe seguir una GUI para cambiar la configuración (trabajando en ella), pero probé el indicador a continuación durante al menos 20 horas y (como se esperaba) hizo el trabajo sin error.

Opciones

El indicador ofrece las siguientes opciones:

  • Mostrar el tiempo textual

    ingrese la descripción de la imagen aquí

  • Mostrar el "área de día" textual ( noche , mañana , día , tarde )

    ingrese la descripción de la imagen aquí

  • Mostrar am / pm

    ingrese la descripción de la imagen aquí

  • Muéstralas todas a la vez (o cualquier combinación de las tres)

    ingrese la descripción de la imagen aquí

  • Hable el tiempo cada cuarto de hora ( espeakrequerido)

  • Opcionalmente, la hora se muestra difusa ; redondeado en cinco minutos, p. ej.
    10:43 -> quarter to eleven.

El script, el módulo y un ícono

La solución existe de un script, un módulo separado y un ícono, que debe almacenar en el mismo directorio .

El icono:

ingrese la descripción de la imagen aquí

Haga clic derecho sobre él y guárdelo como (exactamente) indicator_icon.png

El módulo:

Este es el módulo que produce el tiempo textual y toda la información mostrada. Copie el código, guárdelo como (nuevamente, exactamente ) tcalc.py, junto con el icono de arriba en el mismo directorio .

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

La secuencia de comandos:

Este es el indicador real. Copie el código, guárdelo como moderntimes.py, junto con el icono y el módulo anterior en uno y el mismo directorio .

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

Cómo utilizar

  1. El script necesita espeak:

    sudo apt-get install espeak
    
  2. Copie los tres archivos anteriores en un mismo directorio, exactamente nombrado como se indica en El script, el módulo y un icono

  3. En el encabezado del script ( moderntimes.py), defina qué información debe mostrarse y cómo. Simplemente configure Trueo Falseen la línea:

    # --- 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 la cabecera del módulo , puede cambiar las horas en que comenzará posteriormente mañana , día , tarde , noche , en la línea:

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

    No toques nada más en el script por ahora :)

  5. Los usuarios de Ubuntu Mate deben habilitar el uso de indicadores en su sistema: seleccione Sistema> Preferencias> Apariencia> Ajuste de Mate> Interfaz> "Habilitar indicadores"

    ingrese la descripción de la imagen aquí

  6. Ejecute el indicador con el comando:

    python3 /path/to/moderntimes.py
    

Ejecutarlo desde aplicaciones de inicio

Recuerde que si ejecuta el comando desde Aplicaciones de inicio, en muchos casos necesita agregar un pequeño descanso, especialmente (entre otros) en los indicadores:

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

Notas

  • Sin duda, el script se cambiará / actualizará en los próximos días muchas veces. Una cosa sobre la que me gustaría recibir comentarios en particular es el "estilo" en el que el tiempo digital se convierte en tiempo textual. La forma en que se hace ahora:

    • horas enteras, por ejemplo:

      six o'clock
      
    • menos de 30 minutos después de la hora, p. ej.

      twenty past eleven
      
    • 30 minutos después de la hora, por ejemplo:

      half past five
      
    • más los 30 minutos, por ejemplo:

      twenty to five
      
    • Se mencionan 15 minutos quarter, por ejemplo:

      quarter past six
      
    • la excepción es medianoche, que no se llama zero, pero midnight, por ejemplo:

      quarter past midnight
      
  • El script es extremadamente bajo en jugo, debido al hecho de que después del primer bucle de verificación de tiempo, el bucle se sincroniza automáticamente en el reloj de la computadora. Por lo tanto, el script comprueba el tiempo / edita el tiempo mostrado solo una vez por minuto, durmiendo el resto del tiempo.


Editar

Según hoy (2016-4-9), se encuentra disponible un ppa de una versión pulida. Para instalar desde ppa:

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

Los períodos de días en esta versión cambian, en comparación con la versión de script anterior, ahora es:

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

... y el indicador tiene la opción de cambiar el ícono durante el día:
mañana / tarde / tarde / noche :ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Como se mencionó, esta versión se probó tanto en Mate(de la pregunta original) Unitycomo en Xubuntu.

ingrese la descripción de la imagen aquí

Jacob Vlijm
fuente
1
Yo diría: difuso significa que puede ser inexacto. Entonces, 15:12 a 15:23 más o menos serían las tres y cuarto. Yo diría que solo use: 5/10 / cuarto / media hora / hora. No se llama difusa por nada.
Rinzwind
Otra respuesta asombrosa. Espero que esto se integre en su PPA .... :)
Parto
@Parto wow, gracias de nuevo :) Definitivamente crearé un ppa para este :)
Jacob Vlijm
1

Si tiene Kubuntu (distribución de Ubuntu de Plasma Desktop), tiene un widget incorporado llamado "reloj difuso": ha existido al menos desde 14.04, o hace tanto tiempo que Plasma 4 ha estado fuera, y todavía está en Plasma 5 como se encuentra en Kubuntu 16.04.

El Reloj difuso se puede configurar para que sea tan "preciso" como incrementos de cinco minutos, como leer un reloj analógico (por ejemplo, "diez después de las cuatro"), pero también tiene tres configuraciones "más difusas", una de las cuales da lecturas como "tarde" y uno que solo dice "¡Fin de semana!" (un domingo por la tarde, supongo que dirá "lunes" mañana).

No sé si el reloj difuso está disponible en otros sabores de Ubuntu: lo vi en xfce (como se encuentra en Xubuntu) en mi sistema, pero el sistema operativo se instaló como Kubuntu, por lo que no estoy seguro de si el reloj difuso es nativo de xfce así como KDE / Plasma, ni si está disponible en Unity o Mate.

Zeiss Ikon
fuente