我想让 Conky 使用文字而不是数字来显示时间。
我想要做的或多或少是 Pebble Watch 的外观(红色手表)。
就像图中所见,即使只显示时间而不显示日期。
这可能吗?
答案1
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}
...
这将导致
如果您想要秒数,这应该不难添加。
答案2
是的,这是可能的,但只能通过 Lua 脚本来实现。您需要一个可以输入数字并输出单词的脚本。很多框架(如 Django)都具有此功能,但除非有等效的 Lua 库,否则您可能只能靠自己了:
function conky_translate_number(number) {
if (number == 1) {
return "one";
} else {
return "not a clue";
}
}
您可能只是简单地想编写一个 Python 脚本,利用 Django 的模板语言进行翻译。
答案3
pynum2word
你可以使用以下库编写一个 Python 脚本此 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
库位于同一目录中。
答案4
您不能创建一个由每个数字的书面文字图像组成的符号字体吗?那么您只需选择此字体(如果可能)来显示时间。