Conkyが時間を数字ではなく単語で表示することは可能ですか?


10

Conkyに数字ではなく単語を使用して時間を表示させたい。

私がやりたいのは、多かれ少なかれ、Pebble Watchの外観(Red watch)です。

ここに画像の説明を入力してください

画像のように、日付ではなく時刻のみを表示することもできます。

これは可能ですか?


実際に画像を使用することは私に多くの困難になります...私はLuaの中にプログラムされていないか、前にConkyをを使用しますが、私は素敵な月曜日の朝の挑戦を見て、それは私の下の答えを書くなど、最初から最後まで2時間、かかったん:Pを
ゲルハルトバーガー

それは私が持っていたいくつかの考えだったのは大丈夫です。私はまだどの答えが最もうまくいくか試していません。
Uri Herrera 2013年

回答:


9

Luaスクリプトソリューション

これは確かにLuaスクリプトを使用して可能です。以下のスクリプトを使用できます(数値変換はrosettacode.orgから取得されます)。

スクリプトは、12:45を「12 45」に変換する退屈なオプションと、「4分の1」に変換する素晴らしいオプションを実行できます。また、時間を太字にする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

行を追加する.conkyrcTEXTに、を編集してください

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

3

はい、可能ですが、Luaスクリプトを通じてのみ可能です。数値を取り込んで単語を出力するスクリプトが必要です。Djangoのような多くのフレームワークがこの機能を備えていますが、同等のLuaライブラリーがない限り、自分で使用できます。

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

テンプレート言語を使用して翻訳するためにDjangoを利用するPythonスクリプトを作成したいだけかもしれません。


わかりました、例を追加できますか?
Uri Herrera 2013年

完了しました。初歩的ですが、そうです。必要に応じて詳しく説明しますが、Python全体を教えることは質問の範囲外のようです:)
Naftuli Kay

思ったより少し複雑で、完全な単語(1、2、3など)が含まれている画像を使用する可能性もあり、これらの各画像は時間に応じて変化するので、12の場合:22それは12 22を表示します。
Uri Herrera 2013年

@UriHerreraは実際にはかなり実行可能です。私の回答を
ゲルハルトバーガー

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ライブラリーを配置し、別のファイルsay 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

0

数字ごとに書かれた単語の画像からなるシンボルフォントを作ってみませんか?時間の表示には、このフォント(可能な場合)を選択するだけで十分です。


それがまさに、Conkyがすべてのフォントをロードするわけではないということです。私はConkyがロードしないフォントを持っています、そしてそれらはデフォルトでArialまたはTimes New Romanです。フォントを作成するすべての作業が意味することは言うまでもありません。また、使用した画像は一例です。ボールドフォントで時間を、シン/ライトフォントで分を設定したいと思います。
Uri Herrera 2013年

これは、9を超える数の場合でも機能しません。
Alistair Buxton
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.