เป็นไปได้หรือไม่ที่ Conky จะแสดงเวลาเป็นคำและไม่ใช่ตัวเลข?


10

ฉันต้องการให้ Conky แสดงเวลาโดยใช้คำไม่ใช่ตัวเลข

สิ่งที่ฉันต้องการจะทำคือนาฬิกา Pebble Watch มีลักษณะมากขึ้นหรือน้อยลง ( นาฬิกาสีแดง )

ป้อนคำอธิบายรูปภาพที่นี่

เช่นเดียวกับในรูปภาพแม้ว่าจะแสดงเฉพาะเวลาและไม่ใช่วันที่

เป็นไปได้ไหม


จริง ๆ แล้วการใช้รูปภาพดูยากสำหรับฉันมาก ... ฉันไม่เคยเขียนโปรแกรมใน Lua หรือเคยใช้ Conky มาก่อน แต่ฉันเห็นการท้าทายในเช้าวันจันทร์ที่ดีและใช้เวลา 2 ชั่วโมงตั้งแต่ต้นจนจบรวมถึงการเขียนคำตอบลง: P
Gerhard Burger

มันก็โอเคแค่คิดว่าฉันมี ฉันยังไม่ได้ลองคำตอบไหนดีที่สุด
Uri Herrera

คำตอบ:


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

3

ใช่เป็นไปได้ แต่ผ่านการเขียนสคริปต์ Lua เท่านั้น คุณจะต้องมีสคริปต์ที่ใช้ตัวเลขและคำพูด เฟรมเวิร์กจำนวนมากเช่น Django มีคุณสมบัตินี้ แต่คุณอาจเป็นเจ้าของด้วยตัวคุณเองเว้นแต่ว่าจะมีห้องสมุด Lua ที่เทียบเท่ากับมัน:

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

คุณเพียงแค่อาจต้องการเขียนสคริปต์ Python ซึ่งใช้ประโยชน์จาก Django สำหรับการแปลโดยใช้ภาษาเทมเพลต


ขอบคุณคุณเพิ่มตัวอย่างได้ไหม
Uri Herrera

เสร็จแล้วเป็นพื้นฐาน แต่ใช่ ฉันจะทำอย่างละเอียดหากคุณต้องการ แต่ดูเหมือนว่านอกขอบเขตของคำถามที่จะสอนคุณหลามในสิ่งทั้งปวง :)
Naftuli เคย์

มันซับซ้อนกว่าที่ฉันคิดเล็กน้อยฉันคิดมากขึ้นตามแนวของการใช้ภาพที่มีคำเต็ม (หนึ่งสองสามและอื่น ๆ ) และรูปภาพเหล่านี้จะเปลี่ยนไปตามเวลาดังนั้นถ้ามันเป็น 12 : 22 มันจะแสดงสิบสองยี่สิบสอง
Uri Herrera

@UriHerrera จริง ๆ แล้วมันเป็นไปได้มากดูคำตอบของฉัน
Gerhard Burger

2

คุณสามารถเขียนสคริปต์ python สำหรับสิ่งนี้โดยใช้pynum2wordไลบรารีที่มีอยู่ในหน้า sourceforge นี้

โดยพื้นฐานแล้วมันคืออะไร:

>>> 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 ของคุณเช่น~/.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]))

คุณสามารถเปลี่ยนการจัดรูปแบบของเวลาและรวมวันที่ได้ด้วยหากต้องการ สำหรับตัวเลือกการจัดรูปแบบดูที่หน้านี้

จากนั้นเปิดไฟล์ config 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

สิ่งนี้จะไม่ทำงานแม้สำหรับตัวเลขที่มากกว่าเก้า
Alistair Buxton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.