È 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.