Est-il possible pour Conky d'afficher le temps en mots et non en chiffres?

10

Je veux que Conky affiche l'heure en utilisant des mots et non des nombres.

Ce que je veux faire, c'est plus ou moins à quoi ressemble la montre Pebble ( montre rouge ).

entrez la description de l'image ici

Comme dans l'image, même si seule l'heure et non la date peut être affichée.

Est-ce possible?

Uri Herrera
la source
en fait, utiliser des images me semble beaucoup plus difficile ... Je n'ai jamais programmé en Lua ni utilisé Conky auparavant, mais j'ai vu un beau défi du lundi matin, et cela m'a pris 2 heures du début à la fin, y compris la réponse: P
Gerhard Burger
C'est bon, c'était juste une pensée que j'avais. Je n'ai toujours pas essayé laquelle des réponses fonctionne le mieux.
Uri Herrera

Réponses:

9

Solution de script Lua

Ceci est en effet possible en utilisant les scripts Lua. Vous pouvez utiliser le script ci-dessous (la conversion des nombres est tirée de rosettacode.org ).

Le script peut faire une option ennuyeuse, qui traduira 12:45 à "douze quarante-cinq", et une option impressionnante qui le traduira par "un quart à un". Il fait également une option Uri Herrera qui fait l'heure en gras;)

De plus, il se rafraîchit automatiquement lorsque l'heure change.

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

Maintenant, enregistrez-le quelque part, aux fins de cette question, supposons que nous l'enregistrons sous ~/.config/conky/scripts/pretty_time.lua

Modifiez maintenant votre .conkyrc, avant d' TEXTajouter une ligne

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

cela charge le script afin que nous puissions accéder aux fonctions.

Ensuite, à l'endroit approprié ci TEXT- dessous , vous pouvez appeler les fonctions de la manière suivante (conky ajoute automatiquement le conky_préfixe)

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

Cela se traduira par

entrez la description de l'image ici

Si vous voulez les secondes, cela ne devrait pas être trop difficile de vous ajouter.

Gerhard Burger
la source
Génial! fonctionne bien, maintenant pour trouver comment changer la taille du texte.
Uri Herrera
3

Oui, c'est possible, mais uniquement via les scripts Lua. Vous aurez besoin d'un script qui prend des nombres et génère des mots. Beaucoup de frameworks comme Django ont cette fonctionnalité, mais vous pourriez être seul sauf s'il existe une bibliothèque Lua équivalente:

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

Vous pouvez simplement vouloir écrire un script Python qui utilise Django pour la traduction en utilisant son langage de template.

Naftuli Kay
la source
Ok merci, pouvez-vous ajouter un exemple?
Uri Herrera
Fait, rudimentaire, mais oui. Je peux élaborer si vous le souhaitez, mais il semble hors de portée de la question de vous enseigner le Python dans son intégralité :)
Naftuli Kay
C'est un peu compliqué que je ne le pensais, je pensais plus dans le sens d'utiliser éventuellement des images contenant des mots entiers (un, deux, trois, etc.) et que chacune de ces images changerait en fonction du temps, donc si c'est 12 : 22 il afficherait douze vingt-deux.
Uri Herrera
@UriHerrera en fait c'est tout à fait faisable, voir ma réponse
Gerhard Burger
2

vous pouvez écrire un script python pour cela en utilisant la pynum2wordbibliothèque disponible sur cette page sourceforge

Fondamentalement, ce qu'il fait est:

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

un exemple trivial est ce que j'ai fait ici:

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

Maintenant, pour rendre cela rendu par conky, créez un répertoire à l'intérieur de votre répertoire de configuration conky par exemple ~/.conky/pyscripts/et mettez la pynum2wordbibliothèque à l'intérieur, créez maintenant un autre fichier say timeToWordet mettez ce script dans ce fichier:

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

Vous pouvez modifier la mise en forme de l'heure et inclure la date également, si vous le souhaitez. Pour les options de formatage, consultez cette page .

puis ouvrez le fichier de configuration conky /etc/conky/conky.confet placez cette ligne quelque part:

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

Ce que fait cette ligne, c'est qu'elle exécute le fichier de script toutes les 30 secondes et met à jour la sortie sur la fenêtre conky.

Bien sûr, vous pouvez placer librement les fichiers de script dans n'importe quel répertoire, mais assurez-vous que la pynum2wordbibliothèque se trouve dans le même répertoire.

Gufran
la source
Intéressant, mais disons que je ne sais pas comment ajouter ceci à Conky. Comment ajouter ou que faire au fichier Conky pour qu'il importe la bibliothèque? il affiche donc l'heure comme ça.
Uri Herrera
Je viens de mettre à jour la réponse, veuillez revoir.
Gufran
0

Ne pourriez-vous pas créer une police de symboles composée d'images du mot écrit pour chaque chiffre? Il vous suffit alors de choisir cette police (si possible) pour l'affichage de l'heure.

diamy27
la source
C'est la chose, étonnamment Conky ne charge pas toutes les polices. J'ai des polices que Conky ne charge tout simplement pas, et elles sont par défaut Arial ou Times New Roman. Sans oublier que tout le travail de création d'une police signifie. De plus, l'image que j'ai utilisée est un exemple, j'aimerais avoir les heures en gras et les minutes en mince / clair.
Uri Herrera
Cela ne fonctionnerait même pas de toute façon pour les nombres supérieurs à neuf.
Alistair Buxton