Conky是否可以用文字而非数字显示时间?


10

我想让Conky使用单词而不是数字显示时间。

我想做的或多或少是Pebble Watch的外观(红色手表)。

在此处输入图片说明

就像图像中一样,即使只显示时间而不显示日期。

这可能吗?


实际使用图像对我来说要困难得多……我以前从未在Lua编程或使用过Conky,但是我看到了一个不错的星期一早上的挑战,从头到尾花了我2个小时,包括把答案写下来:P
Gerhard Burger 2013年

没关系,只是我有些想法。我仍然没有尝试过最有效的答案。
Uri Herrera

Answers:


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

这将导致

在此处输入图片说明

如果您想要几秒钟,那么添加自己应该不难。


大!效果很好,现在查找如何更改文本的大小。
Uri Herrera 2013年

3

是的,有可能,但只能通过Lua脚本进行。您将需要一个包含数字并输出单词的脚本。许多框架(例如Django)都具有此功能,但是除非有等效的Lua库,否则您可能会自己使用:

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

您可能只是想编写一个Python脚本,该脚本利用Django的模板语言来进行翻译。


好的,谢谢,您可以添加一个示例吗?
Uri Herrera

完成,基本,但是是的。如果您愿意,我可以详细说明,但是完整地教您使用Python似乎超出了这个问题的范围:)
Naftuli Kay 2013年

这比我想象的要复杂一些,我在考虑甚至可能使用包含完整单词(一个,两个,三个等)的图像,而且这些图像中的每个图像都会根据时间而变化,因此如果是12 :22它会显示十二点二十二分。
乌里·埃雷拉

@UriHerrera实际上这是完全可行的,请参阅我的答案
Gerhard Burger

2

您可以使用此sourceforge页面上pynum2word可用的库为此编写python脚本

基本上,它的作用是:

>>> 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配置文件/etc/conky/conky.conf,并将此行放在某处:

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

该行的作用是,它每30秒执行一次脚本文件,并在conky窗口上更新输出。

当然,您可以将脚本文件自由放置在任何目录中,但要确保pynum2word库位于同一目录中。


有趣,但要说我不知道​​如何将其添加到Conky。如何添加或更改Conky文件,以便它导入库?因此它显示了这样的时间。
Uri Herrera

我刚刚更新了答案,请查看。
Gufran 2013年

0

您是否不能创建一个由每个数字的文字图像组成的符号字体?比起您应该只选择此字体(如果可能)显示时间。


就是这样,令人惊讶的是Conky不会加载所有字体。我有Conky不会加载的字体,它们默认为Arial或Times New Roman。更不用说制作Font的所有工作都意味着。同样,我使用的图像是一个示例,我想将Hours设置为粗体,将Minutes设置为Thin / Light。
Uri Herrera

甚至对于大于9的数字也不起作用。
Alistair Buxton
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.