Fuzzy-Clock para o Ubuntu

8

Há muito tempo atrás, eu tinha um relógio para dizer coisas como manhã, dia, noite, noite, em um aplicativo de painel. Traço amplo, não muito específico, pode ter sido uma área de trabalho do KDE. Eu estou no Ubuntu Mate agora, há uma maneira de obter esta descrição de tempo vaga no painel de mate?

    
por j0h 27.03.2016 / 20:25

2 respostas

14

Relógio textual / falado para Mate e outras variantes do Ubuntu

Embora a questão fosse originalmente sobre o Ubuntu Mate , por sorte, a partir de 15.10, os indicadores também podem ser usados em Mate . Como resultado, a resposta abaixo pelo menos funciona para Unity e Mate e (testada) em Xubuntu .

Uma interface gráfica para alterar as configurações ainda está para ser seguida (trabalhando nisso), mas testei o indicador abaixo por pelo menos 20 horas e (como esperado) ele fez o trabalho sem um erro.

Opções

O indicador oferece as seguintes opções:

  • Mostrar a hora do texto

  • Mostrar a "área do dia" textual ( noite , manhã , dia , noite )

  • Mostrar / m.m.

  • Mostrar todos de uma vez (ou qualquer combinação dos três)

  • Fale o tempo a cada trimestre de uma hora ( espeak obrigatório)

  • Opcionalmente, a hora é exibida difusa ; arredondado em cinco minutos, por exemplo, 10:43 - & gt; quarter to eleven .

O script, o módulo e um ícone

A solução existe de um script, um módulo separado e um ícone, que você precisa armazenar em um e no mesmo diretório .

O ícone:

Clique com o botão direito e salve como (exatamente) indicator_icon.png

O módulo:

Este é o módulo que produz o tempo de texto e todas as outras informações exibidas. Copie o código, salve-o como (novamente, exatamente ) tcalc.py , junto com o ícone acima em um único diretório e o mesmo .

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

O script:

Este é o indicador real. Copie o código, salve-o como moderntimes.py , juntamente com o ícone e o módulo acima em um único diretório e .

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

Como usar

  1. O script precisa de espeak :

    sudo apt-get install espeak
    
  2. Copie todos os três arquivos acima em um único diretório, exatamente nomeado conforme indicado em O script, o módulo e um ícone

  3. Na cabeça do script ( moderntimes.py ), defina quais informações devem ser exibidas e como. Basta definir True ou False na linha:

    # --- 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. Na cabeça do módulo , você pode alterar as horas em que será iniciado subseqüentemente manhã , dia , noite , noite , na linha:

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

    Não toque em mais nada no script por enquanto:)

  5. Os usuários do Ubuntu Mate precisam ativar o uso de indicadores em seu sistema: escolha Sistema & gt; Preferências & gt; Veja e sinta & gt; Ajustar Mate & gt; Interface & gt; "Ativar indicadores"

  6. Execute o indicador com o comando:

    python3 /path/to/moderntimes.py
    

Execução a partir de aplicativos de inicialização

Lembre-se de que, se você executar o comando a partir de Startup Applications, em muitos casos, será necessário adicionar uma pequena interrupção, especialmente (entre outros) nos indicadores:

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

Notas

  • Sem dúvida, o script será alterado / atualizado nos próximos dias várias vezes. Uma coisa sobre a qual eu gostaria de receber feedback é o "estilo" em que o tempo digital é convertido em tempo textual. A maneira como isso é feito agora:

    • horas inteiras, por exemplo:

      six o'clock
      
    • menos de 30 minutos após a hora, e.

      twenty past eleven
      
    • 30 minutos após a hora, por exemplo:

      half past five
      
    • mais 30 minutos, por exemplo:

      twenty to five
      
    • 15 minutos são mencionados quarter , por exemplo:

      quarter past six
      
    • A exceção

      é meia-noite, que não é chamada zero , mas midnight , por exemplo:

      quarter past midnight
      
  • O script é extremamente fraco, devido ao fato de que, após o primeiro loop de verificação de tempo, o loop é sincronizado automaticamente no relógio do computador. Portanto, o script verifica o tempo / edita o horário exibido apenas uma vez por minuto, dormindo o resto do tempo.

Editar

A partir de hoje (2016-4-9), um ppa de uma versão polida está disponível. Para instalar a partir do ppa:

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

Os períodos de dias nesta versão são alterados, em comparação com a versão do script acima, agora é:

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

... e o indicador tem a opção de alterar o ícone durante o dia:
manhã / tarde / noite / noite :

Como mencionado, esta versão foi testada em Mate (da pergunta original) Unity e Xubuntu .

    
por Jacob Vlijm 01.04.2016 / 14:58
0

Se você tem o Kubuntu (Plasma Desktop Ubuntu distro), você tem um widget embutido chamado "fuzzy clock" - já existe desde o 14.04, ou até há muito tempo o Plasma 4 foi lançado, e ainda é no Plasma 5 como encontrado no Kubuntu 16.04.

O Fuzzy Clock pode ser configurado para ser "preciso" em incrementos de cinco minutos, como ler um relógio analógico (digamos, "dez depois de quatro"), mas também possui três configurações "difusas", uma das quais dá leituras "tarde" e um que só dá "fim de semana!" (em uma tarde de domingo - presumo que vai dizer "segunda-feira" amanhã).

Eu não sei se o relógio fuzzy está disponível em outros sabores do Ubuntu - eu vi no xfce (como encontrado no Xubuntu) no meu sistema, mas o sistema operacional foi instalado como Kubuntu, então eu não tenho certeza se o O fuzzy clock é nativo do xfce e do KDE / Plasma, nem está disponível no Unity ou no Mate.

    
por Zeiss Ikon 15.05.2016 / 23:08