Mungkinkah Conky menampilkan Waktu dengan kata-kata dan bukan dalam angka?

10

Saya ingin Conky menampilkan waktu menggunakan kata-kata dan bukan angka.

Yang ingin saya lakukan adalah kurang lebih bagaimana tampilan Pebble Watch ( Red watch ).

masukkan deskripsi gambar di sini

Seperti pada gambar, meski hanya waktu dan bukan tanggal yang bisa ditampilkan.

Apakah ini mungkin?

Uri Herrera
sumber
sebenarnya menggunakan gambar terlihat jauh lebih sulit bagi saya ... Saya tidak pernah memprogram dalam Lua atau menggunakan Conky sebelumnya, tapi saya melihat tantangan Senin pagi yang menyenangkan, dan saya butuh 2 jam dari awal hingga selesai, termasuk menuliskan jawabannya: P
Gerhard Burger
Tidak apa-apa itu hanya beberapa pemikiran yang saya miliki. Saya masih belum mencoba jawaban mana yang paling berhasil.
Uri Herrera

Jawaban:

9

Solusi scripting Lua

Ini memang mungkin menggunakan skrip Lua. Anda dapat menggunakan skrip di bawah ini (konversi nomor diambil dari rosettacode.org ).

Script dapat melakukan opsi yang membosankan, yang akan menerjemahkan 12:45 menjadi "dua belas empat puluh lima", dan opsi yang luar biasa yang akan menerjemahkannya menjadi "seperempat banding satu". Itu juga melakukan opsi Uri Herrera yang melakukan jam berani;)

Juga secara otomatis menyegarkan, ketika waktu berubah.

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

Sekarang simpan di suatu tempat, untuk keperluan pertanyaan ini anggap kita menyimpannya sebagai ~/.config/conky/scripts/pretty_time.lua

Sekarang edit .conkyrc, sebelum TEXTmenambahkan baris

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

ini memuat skrip sehingga kami dapat mengakses fungsinya.

Kemudian, di tempat yang sesuai di bawah ini TEXT, Anda dapat memanggil fungsi dengan cara berikut (conky secara otomatis menambahkan conky_awalan)

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

Ini akan menghasilkan

masukkan deskripsi gambar di sini

Jika Anda menginginkan detik, ini seharusnya tidak terlalu sulit untuk ditambahkan sendiri.

Gerhard Burger
sumber
Bagus! berfungsi dengan baik, sekarang untuk menemukan cara mengubah ukuran teks.
Uri Herrera
3

Ya, itu mungkin, tetapi hanya melalui skrip Lua. Anda membutuhkan skrip yang terdiri dari angka dan kata-kata keluaran. Banyak kerangka kerja seperti Django memiliki fitur ini, tetapi Anda mungkin melakukannya sendiri kecuali ada perpustakaan Lua yang setara untuk itu:

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

Anda mungkin hanya ingin menulis skrip Python yang memanfaatkan Django untuk terjemahan menggunakan bahasa templating-nya.

Naftuli Kay
sumber
Ok terima kasih, bisakah Anda menambahkan contoh?
Uri Herrera
Dilakukan, belum sempurna, tapi ya. Saya bisa menguraikan jika Anda mau, tetapi tampaknya di luar ruang lingkup pertanyaan untuk mengajari Anda Python secara keseluruhan :)
Naftuli Kay
Ini sedikit rumit daripada yang saya pikirkan, saya berpikir lebih dalam tentang kemungkinan bahkan menggunakan gambar yang berisi kata-kata penuh (satu, dua, tiga, dll) dan bahwa masing-masing gambar ini akan berubah sesuai waktu, jadi jika itu 12 : 22 akan menampilkan dua belas dua dua.
Uri Herrera
@UriHerrera sebenarnya cukup bisa dilakukan, lihat jawaban saya
Gerhard Burger
2

Anda dapat menulis skrip python untuk ini menggunakan pynum2wordpustaka yang tersedia di halaman sourceforge ini

Pada dasarnya yang dilakukannya adalah:

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

contoh sepele adalah apa yang saya lakukan di sini:

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

Sekarang untuk membuat ini diterjemahkan oleh conky, buat direktori di dalam direktori konfigurasi conky Anda misalnya ~/.conky/pyscripts/dan letakkan pynum2wordperpustakaan di dalamnya, sekarang buat file lain katakan timeToWorddan masukkan skrip ini ke file ini:

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

Anda dapat mengubah format waktu dan memasukkan tanggal juga, jika Anda mau. Untuk opsi pemformatan, lihat halaman ini .

kemudian buka file konfigurasi conky /etc/conky/conky.confdan letakkan baris ini di suatu tempat:

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

Apa yang dilakukan baris ini adalah, menjalankan file skrip setiap 30 detik dan memperbarui output pada jendela conky.

Tentu saja Anda dapat dengan bebas menempatkan file skrip di direktori mana pun, tetapi pastikan pynum2wordperpustakaan berada di direktori yang sama.

Gufran
sumber
Menarik, tetapi Katakan bahwa saya tidak tahu cara menambahkan ini ke Conky. Bagaimana cara menambahkan atau Apa yang harus dilakukan ke file Conky sehingga mengimpor perpustakaan? jadi ini menampilkan waktu seperti itu.
Uri Herrera
Saya baru saja memperbarui jawabannya, silakan tinjau.
Gufran
0

Tidak bisakah Anda membuat font simbol yang terdiri dari gambar kata yang ditulis untuk setiap angka? Daripada Anda hanya harus memilih font ini (jika mungkin) untuk tampilan waktu.

diamy27
sumber
Itu masalahnya, luar biasa Conky tidak memuat semua font. Saya memiliki font yang tidak akan dimuat oleh Conky, dan default ke Arial atau Times New Roman. Belum lagi bahwa semua pekerjaan membuat Font berarti. Juga gambar yang saya gunakan adalah contoh, saya ingin memiliki Jam dalam font tebal dan Menit dalam font Tipis / Ringan.
Uri Herrera
Ini bahkan tidak akan berhasil untuk angka lebih dari sembilan.
Alistair Buxton