Czy Conky może wyświetlać Czas w słowach, a nie w liczbach?


10

Chcę, aby Conky wyświetlał czas za pomocą słów, a nie cyfr.

Co chcę zrobić, to mniej więcej jak wygląda Pebble Watch ( Red watch ).

wprowadź opis zdjęcia tutaj

Jak na obrazku, nawet jeśli można wyświetlić tylko godzinę, a nie datę.

czy to możliwe?


właściwie używanie obrazów wygląda dla mnie o wiele trudniej ... Nigdy wcześniej nie programowałem w Lua ani nie używałem Conky, ale widziałem fajne wyzwanie w poniedziałek rano i zajęło mi to 2 godziny od początku do końca, w tym zapisanie odpowiedzi: P
Gerhard Burger

W porządku, to tylko jakaś myśl, którą miałem. Nadal nie próbowałem, które z odpowiedzi działają najlepiej.
Uri Herrera

Odpowiedzi:


9

Rozwiązanie skryptowe Lua

Jest to rzeczywiście możliwe przy użyciu skryptów Lua. Możesz użyć skryptu poniżej (konwersja liczb pochodzi z rosettacode.org ).

Skrypt może zrobić nudną opcję, która przełoży 12:45 na „dwanaście czterdzieści pięć”, i niesamowitą opcję, która przełoży go na „kwadrans do jednej”. Robi też opcję Uri Herrera, która odważa godzinę;)

Również automatycznie odświeża się, gdy zmienia się czas.

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

Teraz zapisz gdzieś, dla celów tego pytania załóżmy, że zapisujemy jako ~/.config/conky/scripts/pretty_time.lua

Teraz edytuj swój .conkyrc, zanim TEXTdodasz linię

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

to ładuje skrypt, abyśmy mogli uzyskać dostęp do funkcji.

Następnie w odpowiednim miejscu poniżej TEXTmożesz wywoływać funkcje w następujący sposób (conky automatycznie dodaje conky_prefiks)

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

Spowoduje to

wprowadź opis zdjęcia tutaj

Jeśli chcesz sekund, nie powinno być zbyt trudno dodać siebie.


Świetny! działa dobrze, aby dowiedzieć się, jak zmienić rozmiar tekstu.
Uri Herrera

3

Tak, jest to możliwe, ale tylko poprzez skrypt Lua. Będziesz potrzebował skryptu, który pobierze liczby i wyświetli słowa. Wiele frameworków, takich jak Django, ma tę funkcję, ale możesz być sam, chyba że istnieje odpowiednia biblioteka Lua:

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

Możesz po prostu napisać skrypt w języku Python, który wykorzystuje Django do tłumaczenia przy użyciu języka szablonów.


Ok dzięki, możesz dodać przykład?
Uri Herrera

Zrobione, szczątkowe, ale tak. Mogę rozwinąć, jeśli chcesz, ale wydaje się, że poza zakresem pytania nauczysz cię Pythona w całości :)
Naftuli Kay

Jest to trochę bardziej skomplikowane niż myślałem, myślałem raczej o zastosowaniu nawet obrazów zawierających pełne słowa (jeden, dwa, trzy itd.) I że każdy z tych obrazów zmieniłby się w zależności od czasu, więc jeśli to 12 : 22 wyświetlałoby dwanaście dwadzieścia dwa.
Uri Herrera

@UriHerrera faktycznie jest całkiem wykonalne, patrz moja odpowiedź
Gerhard Burger

2

możesz napisać do tego skrypt Pythona, używając pynum2wordbiblioteki dostępnej na tej stronie sourceforge

Zasadniczo to, co robi:

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

trywialnym przykładem jest to, co tutaj zrobiłem:

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

Teraz, aby renderować to przez conky, utwórz katalog w swoim conky katalogu konfiguracyjnym np. ~/.conky/pyscripts/I umieść pynum2wordw nim bibliotekę, teraz utwórz inny plik powiedz timeToWordi umieść ten skrypt w tym pliku:

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

Jeśli chcesz, możesz zmienić formatowanie godziny i dołączyć także datę. Opcje formatowania znajdziesz na tej stronie .

następnie otwórz plik konfiguracyjny conky /etc/conky/conky.confi umieść gdzieś tę linię:

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

Ta linia wykonuje plik skryptu co 30 sekund i aktualizuje dane wyjściowe w oknie Conky.

Oczywiście możesz swobodnie umieszczać pliki skryptów w dowolnym katalogu, ale upewnij się, że pynum2wordbiblioteka znajduje się w tym samym katalogu.


Ciekawe, ale powiedz, że nie wiem, jak to dodać do Conky. Jak dodać lub Co zrobić w pliku Conky, aby importował bibliotekę? więc wyświetla taki czas.
Uri Herrera

Właśnie zaktualizowałem odpowiedź, proszę przejrzeć.
Gufran

0

Czy nie można stworzyć czcionki symbolicznej, która składałaby się z obrazów słowa zapisanego dla każdej cyfry? Następnie powinieneś po prostu wybrać tę czcionkę (jeśli to możliwe) do wyświetlania czasu.


To jest to, że Conky nie ładuje wszystkich czcionek. Mam czcionki, których Conky po prostu nie ładuje, i domyślnie są to Arial lub Times New Roman. Nie wspominając już o tym, że cała praca nad stworzeniem czcionki oznacza. Również obraz, którego użyłem, jest przykładem, chciałbym mieć Godziny pogrubioną czcionką, a Minuty czcionką Cienka / Lekka.
Uri Herrera

To i tak nie działałoby nawet w przypadku liczb większych niż dziewięć.
Alistair Buxton
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.