Relógio Difuso para Ubuntu

9

Há muito tempo, eu tinha um relógio configurado para dizer coisas como manhã, dia, tarde, noite, para o tempo em um aplicativo de painel. Curso amplo, não muito específico. Pode ter sido uma área de trabalho do KDE. Estou no Ubuntu Mate agora, existe uma maneira de obter essa descrição vaga no painel do mate?

j0h
fonte
11
se isso ajuda, isso é chamado de um relógio difusa
Dmiters
Isso ajuda. :)
j0h 28/03
11
Aqui está o código-fonte: code.google.com/archive/p/fuzzy-clock Agora precisamos do @jacobvlijm para transformá-lo em um aplicativo>: - D
Rinzwind 29/16
Comecei a ler a Mate-University para criar aplicativos de painel. Im certeza de que posso programar algo assim, mas eu não tenho nenhuma pista sobre como fazê-lo um aplicativo de painel
j0h
11
isso foi no KDE, tenho certeza disso, e foi traduzido também!
Antek

Respostas:

15

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

Embora a pergunta fosse originalmente sobre o Ubuntu Mate , felizmente, a partir das 15.10, os indicadores também podem ser usados Mate. Como resultado, a resposta a seguir , pelo menos, funciona para Unitye Matee (testado) em Xubuntu.

Ainda está a seguir uma GUI para alterar as configurações (trabalhando nela), mas testei o indicador abaixo por pelo menos 20 horas e (como esperado) ele fez o trabalho sem erro.

Opções

O indicador oferece as seguintes opções:

  • Mostrar a hora do texto

    insira a descrição da imagem aqui

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

    insira a descrição da imagem aqui

  • Mostrar am / pm

    insira a descrição da imagem aqui

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

    insira a descrição da imagem aqui

  • Fale o tempo a cada quinze minutos ( espeakobrigatório)

  • Opcionalmente, a hora é exibida imprecisa ; arredondado em cinco minutos, por exemplo,
    10:43 -> 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:

insira a descrição da imagem aqui

Clique com o botão direito nele e salve-o 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 mesmo diretório .

#!/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, junto com o ícone e o módulo acima, em um mesmo diretório .

#!/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 espeak:

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

  3. No cabeçalho do script ( moderntimes.py), defina quais informações devem ser exibidas e como. Basta definir Trueou Falsena 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 iniciar subsequentemente manhã , dia , tarde , 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 habilitar o uso de indicadores em seu sistema: escolha Sistema> Preferências> Aparência> Ajuste do Mate> Interface> "Ativar indicadores"

    insira a descrição da imagem aqui

  6. Execute o indicador com o comando:

    python3 /path/to/moderntimes.py
    

Executando-o a partir de aplicativos de inicialização

Lembre-se de que, se você executar o comando a partir de Aplicativos de Inicialização, em muitos casos precisará adicionar uma pequena pausa, 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 em que eu gostaria de receber um feedback específico é o "estilo" em que o tempo digital é convertido em tempo textual. Do jeito que é feito agora:

    • horas inteiras, por exemplo:

      six o'clock
      
    • menos de 30 minutos após a hora, por exemplo

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

      half past five
      
    • mais os 30 minutos, por exemplo:

      twenty to five
      
    • São mencionados 15 minutos 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 baixo em termos de suco, 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 a hora / edita a hora exibida apenas uma vez por minuto, dormindo o resto do tempo.


Editar

Como 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 do dia 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 / tarde / noite :insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

Jacob Vlijm
fonte
11
Eu diria: difuso significa que você pode ser impreciso. Então, das 15h12 às 15h23, seria mais ou menos três e quinze. Eu diria que basta usar: 10/10 / quinze / meia e meia / hora. Não é chamado de distorcido por nada.
Rinzwind #
Mais uma resposta impressionante. Espero que este fica integrado no seu PPA .... :)
Parto
@Parto wow obrigado novamente :) I vai certamente criar um ppa para este :)
Jacob Vlijm
1

Se você possui o Kubuntu (distribuição Linux do Plasma Desktop), você tem um widget interno chamado "relógio distorcido" - ele existe pelo menos desde 14.04, ou desde que o Plasma 4 foi lançado e ainda está no Plasma 5 como encontrado no Kubuntu 16.04.

O relógio difuso pode ser configurado para ser "preciso" como incrementos de cinco minutos, como a leitura de um relógio analógico (digamos, "dez depois das quatro"), mas também possui três configurações "mais nebulosas", uma das quais fornece leituras como "tarde" e um que apenas dá "Weekend!" (em uma tarde de domingo - presumo que diga "segunda-feira" amanhã).

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

Zeiss Ikon
fonte