¿Es posible que Conky muestre el tiempo en palabras y no en números?


10

Quiero que Conky muestre la hora usando palabras y no números.

Lo que quiero hacer es más o menos cómo se ve el Pebble Watch ( reloj rojo ).

ingrese la descripción de la imagen aquí

Al igual que en la imagen, incluso si solo se puede mostrar la hora y no la fecha.

es posible?


En realidad, usar imágenes me parece mucho más difícil ... Nunca programé en Lua o utilicé Conky antes, pero vi un buen desafío el lunes por la mañana, y me tomó 2 horas de principio a fin, incluida la escritura de la respuesta: P
Gerhard Burger

Está bien, era solo un pensamiento que tenía. Todavía no he probado cuál de las respuestas funciona mejor.
Uri Herrera

Respuestas:


9

Solución de script Lua

De hecho, esto es posible utilizando la secuencia de comandos de Lua. Puede usar la secuencia de comandos a continuación (la conversión de números se toma de rosettacode.org ).

El guión puede hacer una opción aburrida, que traducirá 12:45 a "doce cuarenta y cinco", y una opción increíble que lo traducirá a "cuarto para la una". También hace una opción de Uri Herrera que hace la hora en negrita;)

También se actualiza automáticamente cuando cambia la hora.

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

Ahora guárdelo en algún lugar, para el propósito de esta pregunta, suponga que lo guardamos como ~/.config/conky/scripts/pretty_time.lua

Ahora edite su .conkyrc, antes de TEXTagregar una línea

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

Esto carga el script para que podamos acceder a las funciones.

Luego, en el lugar apropiado a continuación TEXT, puede llamar a las funciones de la siguiente manera (conky agrega automáticamente el conky_prefijo)

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

Esto resultará en

ingrese la descripción de la imagen aquí

Si quieres los segundos, esto no debería ser demasiado difícil de agregar.


¡Excelente! funciona bien, ahora para encontrar cómo cambiar el tamaño del texto.
Uri Herrera

3

Sí, es posible, pero solo a través de secuencias de comandos Lua. Necesitará un script que tome números y genere palabras. Muchos frameworks como Django tienen esta característica, pero puede estar solo a menos que haya una biblioteca Lua equivalente para ello:

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

Es posible que simplemente desee escribir un script de Python que aproveche Django para la traducción utilizando su lenguaje de plantillas.


Ok, gracias, ¿puedes agregar un ejemplo?
Uri Herrera

Hecho, rudimentario, pero sí. Puedo dar más detalles si lo desea, pero parece fuera del alcance de la pregunta enseñarle Python en su totalidad :)
Naftuli Kay

Es un poco complicado de lo que pensaba, estaba pensando más en la línea de posiblemente incluso usar imágenes que contenían palabras completas (una, dos, tres, etc.) y que cada una de estas imágenes cambiaría de acuerdo con el tiempo, así que si son 12 : 22 mostraría las doce y veinte.
Uri Herrera

@UriHerrera en realidad es bastante factible, mira mi respuesta
Gerhard Burger

2

puede escribir un script de Python para esto usando la pynum2wordbiblioteca disponible en esta página de sourceforge

Básicamente lo que hace es:

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

Un ejemplo trivial es lo que hice aquí:

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

Ahora para hacer que esto sea procesado por conky, cree un directorio dentro de su directorio de configuración de conky, por ejemplo, ~/.conky/pyscripts/y coloque la pynum2wordbiblioteca dentro de él, ahora cree otro archivo, diga timeToWordy coloque este script en este archivo:

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

Puede cambiar el formato de la hora e incluir la fecha también, si lo desea. Para ver las opciones de formato, eche un vistazo a esta página .

luego abra el archivo de configuración conky /etc/conky/conky.confy coloque esta línea en alguna parte:

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

Lo que hace esta línea es ejecutar el archivo de script cada 30 segundos y actualizar la salida en la ventana conky.

Por supuesto, puede colocar libremente los archivos de script en cualquier directorio, pero asegúrese de que la pynum2wordbiblioteca esté en el mismo directorio.


Interesante, pero diga que no sé cómo agregar esto a Conky. ¿Cómo agrego o qué hago al archivo Conky para que importe la biblioteca? entonces muestra el tiempo así.
Uri Herrera

Acabo de actualizar la respuesta, por favor revise.
Gufran

0

¿No podría crear una fuente de símbolos que conste de imágenes de la palabra escrita para cada número? De lo que debería tener que elegir esta fuente (si es posible) para la visualización del tiempo.


Esa es la cosa, sorprendentemente Conky no carga todas las fuentes. Tengo fuentes que Conky simplemente no cargará, y por defecto son Arial o Times New Roman. Sin mencionar que todo el trabajo que hace una Fuente significa. Además, la imagen que utilicé es un ejemplo, me gustaría tener horas en una fuente en negrita y minutos en una fuente delgada / ligera.
Uri Herrera

Esto ni siquiera funcionaría de todos modos para números mayores que nueve.
Alistair Buxton
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.