È possibile per Conky visualizzare il Tempo in parole e non in numeri?


10

Voglio che Conky visualizzi l'ora usando parole e non numeri.

Quello che voglio fare è più o meno l'aspetto di Pebble Watch ( orologio rosso ).

inserisci qui la descrizione dell'immagine

Come nell'immagine, anche se è possibile visualizzare solo l'ora e non la data.

È possibile?


in realtà usare le immagini mi sembra molto più difficile ... Non avevo mai programmato in Lua né usato Conky prima, ma ho visto una bella sfida del lunedì mattina e mi ci sono volute 2 ore dall'inizio alla fine, inclusa la scrittura della risposta: P
Gerhard Burger

Va bene era solo un pensiero che avevo. Non ho ancora provato quale delle risposte funziona meglio.
Uri Herrera,

Risposte:


9

Soluzione di scripting Lua

Questo è davvero possibile usando lo scripting Lua. È possibile utilizzare lo script seguente (la conversione del numero è tratta da rosettacode.org ).

Lo script può fare un'opzione noiosa, che tradurrà 12:45 in "dodici quarantacinque", e un'opzione fantastica che lo tradurrà in "un quarto a uno". Fa anche un'opzione Uri Herrera che fa l'ora in grassetto;)

Inoltre si aggiorna automaticamente quando il tempo cambia.

words = {"one ", "two ", "three ", "four ", "five ", "six ", "seven ", "eight ", "nine "}
levels = {"thousand ", "million ", "billion ", "trillion ", "quadrillion ", "quintillion ", "sextillion ", "septillion ", "octillion ", [0] = ""}
iwords = {"ten ", "twenty ", "thirty ", "forty ", "fifty ", "sixty ", "seventy ", "eighty ", "ninety "}
twords = {"eleven ", "twelve ", "thirteen ", "fourteen ", "fifteen ", "sixteen ", "seventeen ", "eighteen ", "nineteen "}

function digits(n)
  local i, ret = -1
  return function()
    i, ret = i + 1, n % 10
    if n > 0 then
      n = math.floor(n / 10)
      return i, ret
    end
  end
end

level = false
function getname(pos, dig)
  level = level or pos % 3 == 0
  if(dig == 0) then return "" end
  local name = (pos % 3 == 1 and iwords[dig] or words[dig]) .. (pos % 3 == 2 and "hundred " or "")
  if(level) then name, level = name .. levels[math.floor(pos / 3)], false end
  return name
end

function numberToWord(number)
    if(number == 0) then return "zero" end
    vword = ""
    for i, v in digits(number) do
      vword = getname(i, v) .. vword
    end

    for i, v in ipairs(words) do
      vword = vword:gsub("ty " .. v, "ty-" .. v)
      vword = vword:gsub("ten " .. v, twords[i])
    end
    return vword
end

function conky_boringTime()
    hour = os.date("%H") + 0
    minute = os.date("%M") + 0
    return numberToWord(hour) .. numberToWord(minute)
end

function conky_awesomeTime()
    hour = os.date("%H") + 0
    minute = os.date("%M") + 0
    hour = hour % 12
    if(hour == 0) then 
        hour, nextHourWord = 12, "one " 
    else
        nextHourWord = numberToWord(hour+1)
    end
    hourWord = numberToWord(hour)
    if(minute == 0 ) then 
        return hourWord .. "o'clock"
    elseif(minute == 30) then
        return "half past " .. hourWord
    elseif(minute == 15) then
        return "a quarter past " .. hourWord 
    elseif(minute == 45) then
        return "a quarter to " .. nextHourWord 
    else
        if(minute < 30) then
            return numberToWord(minute) .. "past " .. hourWord
        else
            return numberToWord(60-minute) .. "to " .. nextHourWord
        end
    end
end

function conky_getHourWord()
    return numberToWord(os.date("%H") + 0)
end

function conky_getMinuteWord()
    return numberToWord(os.date("%M") + 0)
end

Ora salvalo da qualche parte, ai fini di questa domanda supponiamo che lo salviamo come ~/.config/conky/scripts/pretty_time.lua

Ora modifica il tuo .conkyrc, prima di TEXTaggiungere una riga

lua_load ~/.config/conky/scripts/pretty_time.lua

questo carica lo script in modo che possiamo accedere alle funzioni.

Quindi, nel punto appropriato di seguito TEXT, è possibile chiamare le funzioni nel modo seguente (conky aggiunge automaticamente il conky_prefisso)

TEXT
...
${color grey}Boring time:$color ${lua boringTime}
${color grey}Awesome time:$color ${lua awesomeTime}
${color grey}Special Uri Herrera:$color ${font Aria:bold} ${lua getHourWord}$font ${lua getMinuteWord}
...

Ciò comporterà

inserisci qui la descrizione dell'immagine

Se vuoi i secondi, questo non dovrebbe essere troppo difficile da aggiungere.


Grande! funziona bene, ora per scoprire come modificare la dimensione del testo.
Uri Herrera,

3

Sì, è possibile, ma solo attraverso gli script di Lua. Avrai bisogno di uno script che contenga numeri e produca parole. Molti framework come Django hanno questa funzione, ma potresti essere da solo a meno che non ci sia una libreria Lua equivalente per questo:

function conky_translate_number(number) {
    if (number == 1) { 
        return "one";
    } else {
        return "not a clue";
    }
}

Potresti semplicemente scrivere uno script Python che sfrutta Django per la traduzione usando il suo linguaggio di template.


Ok grazie, puoi aggiungere un esempio?
Uri Herrera,

Fatto, rudimentale, ma sì. Posso approfondire se lo desideri, ma sembra al di fuori dell'ambito della domanda insegnarti Python nella sua interezza :)
Naftuli Kay,

È un po 'complicato di quanto pensassi, stavo pensando più lungo il modo di usare persino immagini che contenevano parole intere (una, due, tre, ecc.) E che ognuna di queste immagini cambierebbe in base al tempo, quindi se è 12 : 22 mostrerebbe dodici ventidue.
Uri Herrera,

@UriHerrera in realtà è abbastanza fattibile, vedi la mia risposta
Gerhard Burger

2

puoi scrivere uno script Python per questo usando la pynum2wordlibreria disponibile in questa pagina di sourceforge

Fondamentalmente quello che fa è:

>>> import num2word
>>> num2word.to_card(10)
'ten'
>>> num2word.to_card(100)
'one hundred'
>>> num2word.to_card(1025)
'one thousand and twenty-five'

un esempio banale è quello che ho fatto qui:

>>> import datetime
>>> import num2word
>>> now = datetime.datetime.now()
>>> t = datetime.time(now.hour, now.minute, now.second).strftime('%H:%M:%S').split(':')
>>> print "%s hours %s minutes and %s seconds" %(num2word.to_card(t[0]), num2word.to_card(t[1]), num2word.to_card(t[2]))
>>> two hours thirty one minutes and fifteen seconds

Ora per renderlo reso da Conky, crea una directory all'interno della tua directory di configurazione Conky, ad esempio ~/.conky/pyscripts/e inserisci la pynum2wordlibreria al suo interno, ora crea un altro file timeToWorde inserisci questo script in questo file:

#!/bin/python
import datetime
import num2word
now = datetime.datetime.now()
t = datetime.time(now.hour, now.minute, now.second).strftime('%H:%M:%S').split(':')
print "%s hours %s minutes and %s seconds" %(num2word.to_card(t[0]), num2word.to_card(t[1]), num2word.to_card(t[2]))

Puoi modificare la formattazione dell'ora e includere anche la data, se lo desideri. Per le opzioni di formattazione dai un'occhiata a questa pagina .

quindi apri il file di configurazione conky /etc/conky/conky.confe metti questa linea da qualche parte:

{execpi 30 ~/.conky/pyscripts/timeToWord}

Ciò che questa linea fa è, esegue il file di script ogni 30 secondi e aggiorna l'output su una finestra conky.

Ovviamente puoi posizionare liberamente i file di script in qualsiasi directory ma assicurati che la pynum2wordlibreria sia nella stessa directory.


Interessante, ma dì che non so come aggiungere questo a Conky. Come aggiungo o cosa faccio al file Conky in modo che importi la libreria? quindi visualizza l'ora in quel modo.
Uri Herrera,

Ho appena aggiornato la risposta, si prega di rivedere.
Gufran,

0

Non potresti creare un simbolo-carattere che consiste in immagini della parola scritta per ogni numero? Quindi dovresti solo scegliere questo carattere (se possibile) per la visualizzazione del tempo.


Questa è la cosa, sorprendentemente Conky non carica tutti i caratteri. Ho dei caratteri che Conky semplicemente non caricherà e per impostazione predefinita sono Arial o Times New Roman. Per non parlare del fatto che tutto il lavoro di creazione di un carattere significa. Anche l'immagine che ho usato è un esempio, mi piacerebbe avere Ore in un carattere grassetto e Minuti in un carattere Sottile / Chiaro.
Uri Herrera,

Questo non funzionerebbe nemmeno per numeri maggiori di nove.
Alistair Buxton,
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.