Возможно ли, чтобы Конки отображал Время словами, а не цифрами?

10

Я хочу, чтобы Конки отображал время, используя слова, а не цифры.

То, что я хочу сделать, - это более или менее то, как выглядят часы Pebble Watch ( красные часы ).

введите описание изображения здесь

Как на картинке, даже если можно показать только время, а не дату.

Это возможно?

Ури Эррера
источник
на самом деле, использование изображений выглядит для меня намного сложнее ... Я никогда не программировал на Lua и не использовал Conky раньше, но я видел хороший вызов в понедельник утром, и мне потребовалось 2 часа от начала до конца, включая написание ответа: P
Герхард Бургер
Это нормально, это была просто мысль, которая у меня была. Я до сих пор не попробовал, какой из ответов работает лучше всего.
Ури Эррера

Ответы:

9

Lua скриптовое решение

Это действительно возможно с использованием сценариев Lua. Вы можете использовать скрипт ниже (преобразование номера взято с rosettacode.org ).

Скрипт может сделать скучную опцию, которая переведет 12:45 на «двенадцать сорок пять», и потрясающую опцию, которая переведет его на «без четверти один». Это также делает выбор Uri Herrera, который делает час жирным;)

Также он автоматически обновляется, когда время меняется.

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

Теперь сохраните его где-нибудь, для целей этого вопроса предположим, что мы сохраняем его как ~/.config/conky/scripts/pretty_time.lua

Теперь отредактируйте свой .conkyrc, прежде чем TEXTдобавить строку

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

это загружает скрипт, чтобы мы могли получить доступ к функциям.

Затем в соответствующем месте ниже TEXTвы можете вызывать функции следующим образом (conky автоматически добавляет conky_префикс)

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

Это приведет к

введите описание изображения здесь

Если вы хотите секунды, это не должно быть слишком сложно добавить себя.

Герхард Бургер
источник
Большой! хорошо работает, теперь, чтобы найти, как изменить размер текста.
Ури Эррера
3

Да, это возможно, но только через скрипты Lua. Вам понадобится скрипт, который принимает цифры и выводит слова. Многие фреймворки, такие как Django, имеют эту функцию, но вы можете быть самостоятельно, если для нее не существует эквивалентной библиотеки Lua:

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

Вы можете просто захотеть написать скрипт на Python, который использует Django для перевода с использованием языка шаблонов.

Нафтули Кей
источник
Хорошо, спасибо, вы можете добавить пример?
Ури Эррера
Готово, элементарно, но да. Я могу уточнить, если хотите, но это выходит за рамки вопроса, чтобы научить вас Python полностью :)
Нафтули Кей
Это немного сложнее, чем я думал, я думал больше, возможно, даже используя изображения, содержащие полные слова (одно, два, три и т. Д.), И что каждое из этих изображений будет меняться в зависимости от времени, поэтому, если это 12 : 22 это будет отображать двенадцать двадцать два.
Ури Эррера
@UriHerrera на самом деле это вполне выполнимо, посмотрите мой ответ
Герхард Бургер
2

Вы можете написать сценарий Python для этого, используя pynum2wordбиблиотеку, доступную на этой странице sourceforge

В основном то, что это делает:

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

тривиальный пример - то, что я сделал здесь:

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

Теперь, чтобы сделать это с помощью conky, создайте каталог внутри вашего каталога конфигурации conky, например, ~/.conky/pyscripts/и поместите в него pynum2wordбиблиотеку, теперь создайте другой файл скажем timeToWordи поместите этот скрипт в этот файл:

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

Вы можете изменить форматирование времени и включить дату, если хотите. Для вариантов форматирования взгляните на эту страницу .

затем откройте конфигурационный файл conky /etc/conky/conky.confи поместите эту строку куда-нибудь:

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

Эта строка выполняет файл скрипта каждые 30 секунд и обновляет вывод в окне conky.

Конечно, вы можете свободно размещать файлы скриптов в любом каталоге, но убедитесь, что pynum2wordбиблиотека находится в том же каталоге.

Gufran
источник
Интересно, но скажи, что я не знаю, как добавить это к Конки. Как добавить или что сделать в файл Conky, чтобы он импортировал библиотеку? таким образом, это показывает время как это.
Ури Эррера
Я только что обновил ответ, пожалуйста, просмотрите.
Гуфран
0

Не могли бы вы создать символ-шрифт, состоящий из изображений написанного слова для каждой цифры? Чем вам просто нужно выбрать этот шрифт (если это возможно) для отображения времени.

diamy27
источник
В том-то и дело, что удивительно, что Конки загружает не все шрифты. У меня есть шрифты, которые Conky просто не загружает, и они по умолчанию используют Arial или Times New Roman. Не говоря уже о том, что вся работа по созданию шрифта означает. Также изображение, которое я использовал, является примером, я хотел бы иметь Часы жирным шрифтом и Минуты Тонким / Легким шрифтом.
Ури Эррера
Это даже не сработало бы для чисел больше девяти.
Алистер Бакстон