Чи можна Конкі відображати час словами, а не цифрами?


10

Я хочу, щоб Конкі відображав час, використовуючи слова, а не цифри.

Що я хочу зробити, це більш-менш те, як виглядає Pebble Watch ( Червоний годинник ).

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

Як і на зображенні, навіть якщо може бути показаний лише час, а не дата.

Чи можливо це?


насправді використання зображень для мене виглядає набагато важче ... Я ніколи не програмував у Луа і не використовував Конкі раніше, але побачив приємний виклик вранці в понеділок, і мені знадобилося 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

Так, це можливо, але тільки через сценарії Луа. Вам знадобиться сценарій, який містить цифри і виводить слова. Багато функцій, таких як Django, мають цю функцію, але ви можете бути самостійно, якщо для неї не існує еквівалентної бібліотеки Lua:

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

Ви можете просто просто написати сценарій Python, який використовує Django для перекладу, використовуючи його мову шаблонів.


Добре дякую, ви можете додати приклад?
— Урі Еррера

Зроблено, рудиментарний, але так. Я можу пояснити, якщо ви хочете, але це здається поза рамками питання, щоб навчити вас Python у повному обсязі :)
— Naftuli Kay

Це трохи складніше, ніж я думав, я більше думав, можливо, навіть використовував зображення, що містять повні слова (один, два, три і т. Д.), І що кожне з цих зображень буде змінюватися відповідно до часу, так що якщо це 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 config, наприклад, ~/.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 config /etc/conky/conky.confта покладіть цей рядок десь:

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

Цей рядок і полягає в тому, що він виконує файл сценарію кожні 30 секунд і оновлює вихід у conky вікні.

Звичайно, ви можете вільно розміщувати файли сценаріїв у будь-якому каталозі, але переконайтесь, що pynum2wordбібліотека знаходиться в одному каталозі.


Цікаво, але скажіть, що я не знаю, як додати це до Конкі. Як додати або що робити з файлом Conky, щоб він імпортував бібліотеку? тому він відображає такий час.
— Урі Еррера

Щойно я оновив відповідь, будь ласка, перегляньте.
— Гуфран

0

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


У цьому річ, дивовижно Conky завантажує не всі шрифти. У мене є шрифти, які Conky просто не завантажують, і вони за замовчуванням ставляться до Arial або Times New Roman. Не кажучи вже про те, що вся робота над створенням шрифту означає. Також приклад, який я використав, - це приклад, я хотів би мати Годинник жирним шрифтом та Хвилини шрифтом Thin / Light.
— Урі Еррера

Це навіть не спрацювало б із числами, що перевищують дев'ять.
— Алістер Бакстон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.