Conky có thể hiển thị Thời gian bằng chữ và không bằng số không?


10

Tôi muốn Conky hiển thị thời gian bằng các từ và không phải số.

Những gì tôi muốn làm là ít nhiều như thế nào Đồng hồ Pebble trông ( Đồng hồ màu đỏ ).

nhập mô tả hình ảnh ở đây

Giống như trong hình ảnh, ngay cả khi chỉ có thời gian và không thể hiển thị ngày.

Điều này có thể không?


thực sự sử dụng hình ảnh có vẻ khó hơn nhiều đối với tôi ... Tôi chưa bao giờ lập trình ở Lua hoặc sử dụng Conky trước đây, nhưng tôi đã thấy một thử thách sáng thứ Hai tốt đẹp, và tôi phải mất 2 giờ từ khi bắt đầu đến khi kết thúc, bao gồm viết câu trả lời: P
Gerhard Burger

Không sao, đó chỉ là một vài suy nghĩ mà tôi có. Tôi vẫn chưa thử câu trả lời nào hoạt động tốt nhất.
Uri Herrera

Câu trả lời:


9

Giải pháp kịch bản Lua

Điều này thực sự có thể sử dụng kịch bản Lua. Bạn có thể sử dụng tập lệnh bên dưới (chuyển đổi số được lấy từ rosettacode.org ).

Kịch bản có thể thực hiện một tùy chọn nhàm chán, sẽ dịch 12:45 thành "mười hai bốn mươi lăm", và một tùy chọn tuyệt vời sẽ dịch nó thành "một phần tư thành một". Nó cũng thực hiện một tùy chọn Uri Herrera làm đậm giờ;)

Ngoài ra nó tự động làm mới, khi thời gian thay đổi.

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

Bây giờ hãy lưu nó ở đâu đó, vì mục đích của câu hỏi này giả sử chúng ta lưu nó dưới dạng ~/.config/conky/scripts/pretty_time.lua

Bây giờ chỉnh sửa của bạn .conkyrc, trước khi TEXTthêm một dòng

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

Điều này tải tập lệnh để chúng ta có thể truy cập các chức năng.

Sau đó, tại vị trí thích hợp bên dưới TEXT, bạn có thể gọi các hàm theo cách sau (conky tự động thêm conky_tiền tố)

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

Điều này sẽ dẫn đến

nhập mô tả hình ảnh ở đây

Nếu bạn muốn vài giây, điều này không quá khó để thêm chính mình.


Tuyệt quá! hoạt động tốt, bây giờ để tìm cách thay đổi kích thước của văn bản.
Uri Herrera

3

Vâng, điều đó là có thể, nhưng chỉ thông qua kịch bản Lua. Bạn sẽ cần một tập lệnh lấy số và xuất ra từ. Rất nhiều khung như Django có tính năng này, nhưng bạn có thể tự mình làm được trừ khi có thư viện Lua tương đương cho nó:

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

Bạn có thể chỉ đơn giản muốn viết một tập lệnh Python sử dụng Django cho bản dịch bằng ngôn ngữ tạo khuôn mẫu của nó.


Ok cảm ơn, bạn có thể thêm một ví dụ?
Uri Herrera

Xong, thô sơ, nhưng ừ. Tôi có thể giải thích nếu bạn thích, nhưng có vẻ như ngoài phạm vi câu hỏi để dạy cho bạn toàn bộ Python :)
Naftuli Kay

Nó hơi phức tạp hơn tôi nghĩ, tôi đã suy nghĩ nhiều hơn về các dòng thậm chí có thể sử dụng các hình ảnh có chứa các từ đầy đủ (một, hai, ba, v.v.) và rằng mỗi hình ảnh này sẽ thay đổi theo thời gian, vì vậy nếu là 12 : 22 nó sẽ hiển thị mười hai mươi hai.
Uri Herrera

@UriHerrera thực sự là hoàn toàn có thể làm được, hãy xem câu trả lời của tôi
Gerhard Burger

2

bạn có thể viết một kịch bản python cho điều này bằng cách sử dụng pynum2wordthư viện có sẵn tại trang sourceforge này

Về cơ bản những gì nó làm là:

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

một ví dụ tầm thường là những gì tôi đã làm ở đây:

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

Bây giờ để thực hiện điều này bằng conky, hãy tạo một thư mục bên trong thư mục cấu hình conky của bạn, vd ~/.conky/pyscripts/và đặt pynum2wordthư viện bên trong nó, bây giờ tạo một tệp khác nói timeToWordvà đặt tập lệnh này vào tệp này:

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

Bạn có thể thay đổi định dạng thời gian và bao gồm cả ngày, nếu bạn muốn. Đối với các tùy chọn định dạng có một cái nhìn vào trang này .

sau đó mở tệp cấu hình conky /etc/conky/conky.confvà đặt dòng này ở đâu đó:

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

Dòng này làm gì, nó thực thi tệp script cứ sau 30 giây và cập nhật đầu ra trên cửa sổ conky.

Tất nhiên bạn có thể tự do đặt các tập tin script trong bất kỳ thư mục nào nhưng đảm bảo rằng pynum2wordthư viện nằm trong cùng thư mục.


Thú vị, nhưng nói rằng tôi không biết cách thêm nó vào Conky. Làm cách nào để thêm hoặc làm gì với tệp Conky để nó nhập thư viện? để nó hiển thị thời gian như thế
Uri Herrera

Tôi chỉ cập nhật câu trả lời, xin vui lòng xem lại.
Gufran

0

Bạn không thể tạo một phông chữ biểu tượng bao gồm hình ảnh của chữ viết cho mỗi chữ số? Hơn bạn chỉ cần chọn phông chữ này (nếu có thể) để hiển thị thời gian.


Đó là điều, đáng kinh ngạc Conky không tải tất cả các phông chữ. Tôi có các phông chữ mà Conky sẽ không tải và chúng mặc định là Arial hoặc Times New Roman. Chưa kể rằng tất cả các công việc làm cho một Font có nghĩa. Ngoài ra hình ảnh tôi sử dụng là một ví dụ, tôi muốn có Giờ ở phông chữ đậm và Phút trong phông chữ Mỏng / Nhẹ.
Uri Herrera

Điều này thậm chí sẽ không hoạt động đối với số lớn hơn chín.
Alistair Buxton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.