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
-
O script precisa de
espeak
:sudo apt-get install espeak
-
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
-
Na cabeça do script (
moderntimes.py
), defina quais informações devem ser exibidas e como. Basta definirTrue
ouFalse
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
-
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:)
-
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"
-
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
, masmidnight
, 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
.