Fuzzy-Clock สำหรับ Ubuntu


9

เมื่อไม่นานมานี้ฉันมีนาฬิกาตั้งให้พูดสิ่งต่าง ๆ เช่นตอนเช้ากลางวันเย็นกลางคืนตลอดเวลาในแอปแผงควบคุม ในวงกว้างไม่เฉพาะเจาะจงมากอาจเป็นเดสก์ท็อป KDE ตอนนี้ฉันอยู่ใน Ubuntu Mate แล้วมีวิธีหาคำอธิบายเวลาที่คลุมเครือในแผงควบคุมคู่ครองหรือไม่?


1
ถ้ามันช่วยได้สิ่งนี้เรียกว่านาฬิกาฟัสซี
Dmiters

มันช่วยได้ :)
j0h

1
นี่คือซอร์สโค้ด: code.google.com/archive/p/fuzzy-clock ตอนนี้เราต้องการ @jacobvlijm เพื่อทำให้มันเป็นแอป>: - D
Rinzwind

ฉันเริ่มอ่าน Mate-University เพื่อสร้างแอปแผง ฉันแน่ใจว่าฉันสามารถเขียนโปรแกรมแบบนี้ได้ แต่ฉันไม่มีเงื่อนงำเกี่ยวกับวิธีทำให้แอปแผงควบคุม
j0h

1
นี่เป็น KDE ฉันมั่นใจในสิ่งนี้และได้รับการแปลด้วย!
Antek

คำตอบ:


15

นาฬิกาข้อความ / การพูดสำหรับ Mate และตัวแปรอื่น ๆ ของ Ubuntu

แม้ว่าคำถามนั้นเกี่ยวกับUbuntu Mate มาก่อนแต่โชคดีที่จาก 15.10 ตัวบ่งชี้สามารถใช้งานได้Mateเช่นกัน เป็นผลให้คำตอบดังต่อไปนี้อย่างน้อยทำงานให้UnityและMateและ (ทดสอบ) Xubuntuบน

GUI เพื่อเปลี่ยนการตั้งค่ายังคงเป็นไปตาม (ทำงานกับมัน) แต่ฉันทดสอบตัวบ่งชี้ด้านล่างเป็นเวลาอย่างน้อย 20 ชั่วโมงและ (ตามที่คาดไว้) มันทำงานได้โดยไม่มีข้อผิดพลาด

ตัวเลือก

ตัวบ่งชี้มีตัวเลือกดังต่อไปนี้:

  • แสดงเวลาที่เป็นข้อความ

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

  • แสดงข้อความ "พื้นที่กลางวัน" ( กลางคืน , เช้า , กลางวัน , เย็น )

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

  • แสดงเป็นเวลาเที่ยงคืน

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

  • แสดงทั้งหมดในครั้งเดียว (หรือทั้งสามอย่างรวมกัน)

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

  • พูดเวลาทุก ๆ สี่ชั่วโมง ( espeakจำเป็น)

  • เลือกเวลาที่จะปรากฏเลือน ; โค้งมนในห้านาทีเช่น
    10:43 quarter to eleven->

สคริปต์โมดูลและไอคอน

วิธีการแก้ปัญหาที่มีอยู่ของสคริปต์โมดูลแยกต่างหากและไอคอนที่คุณจำเป็นต้องเก็บไว้ในที่หนึ่งและไดเรกทอรีเดียวกัน

ไอคอน:

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

คลิกขวาบนมันแล้วบันทึกเป็น (ตรง) indicator_icon.png

โมดูล:

นี่คือโมดูลที่สร้างเวลาที่เป็นข้อความและข้อมูลที่แสดงอื่น ๆ ทั้งหมด คัดลอกโค้ดบันทึกเป็น (อีกครั้งว่า ) tcalc.pyพร้อมกับไอคอนด้านบนในหนึ่งและไดเรกทอรีเดียวกัน

#!/usr/bin/env python3
import time

# --- set starttime of morning, day, evening, night (whole hrs)
limits = [6, 9, 18, 21]
# ---

periods = ["night", "morning", "day", "evening", "night"]

def __fig(n):
    singles = [
        "midnight", "one", "two", "three", "four", "five", "six",
        "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen",
        "fourteen", "quarter", "sixteen", "seventeen", "eighteen", "nineteen",
        ]
    tens = ["twenty", "half"]
    if n < 20:
        return singles[n]
    else:
        if n%10 == 0:
            return tens[int((n/10)-2)]
        else:
            fst = tens[int(n/10)-2]
            lst = singles[int(str(n)[-1])]
            return fst+"-"+lst

def __fuzzy(currtime):
    minutes = round(currtime[1]/5)*5
    if minutes == 60:
        currtime[1] = 0
        currtime[0] = currtime[0] + 1
    else:
        currtime[1] = minutes
    currtime[0] = 0 if currtime[0] == 24 else currtime[0]
    return currtime

def textualtime(fuzz):
    currtime = [int(n) for n in time.strftime("%H %M %S").split()]
    currtime = __fuzzy(currtime) if fuzz == True else currtime
    speak = True if currtime[1]%15 == 0 else False
    period = periods[len([n for n in limits if currtime[0] >= n])]
    # define a.m. / p.m.
    if currtime[0] >= 12:
        daytime = "p.m."
        if currtime[0] == 12:
            if currtime[1] > 30:
                currtime[0] = currtime[0] - 12
        else:
            currtime[0] = currtime[0] - 12
    else:
        daytime = "a.m."
    # convert time to textual time
    if currtime[1] == 0:
        t = __fig(currtime[0])+" o'clock" if currtime[0] != 0 else __fig(currtime[0])
    elif currtime[1] > 30:
        t = __fig((60 - currtime[1]))+" to "+__fig(currtime[0]+1)
    else:
        t = __fig(currtime[1])+" past "+__fig(currtime[0])
    return [t, period, daytime, currtime[2], speak]

สคริปต์:

นี่คือตัวบ่งชี้ที่แท้จริง คัดลอกโค้ดบันทึกเป็นmoderntimes.pyพร้อมกับไอคอนและโมดูลดังกล่าวข้างต้นวันในหนึ่งและไดเรกทอรีเดียวกัน

#!/usr/bin/env python3
import os
import signal
import subprocess
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, AppIndicator3, GObject
import time
from threading import Thread
import tcalc

# --- define what to show:
# showtime = textual time, daytime = a.m./p.m. period = "night"/"morning"/day"/"evening"
# speak = speak out time every quarter, fuzzy = round time on 5 minutes
showtime = True; daytime = False; period = True; speak = True; fuzzy = True

class Indicator():
    def __init__(self):
        self.app = 'about_time'
        path = os.path.dirname(os.path.abspath(__file__))
        self.indicator = AppIndicator3.Indicator.new(
            self.app, os.path.abspath(path+"/indicator_icon.png"),
            AppIndicator3.IndicatorCategory.OTHER)
        self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)       
        self.indicator.set_menu(self.create_menu())

        self.update = Thread(target=self.get_time)
        self.update.setDaemon(True)
        self.update.start()

    def get_time(self):
        # the first loop is 0 seconds, the next loop is 60 seconds,
        # in phase with computer clock
        loop = 0; timestring1 = ""
        while True:
            time.sleep(loop)
            tdata = tcalc.textualtime(fuzzy)
            timestring2 = tdata[0]
            loop = (60 - tdata[3])+1
            mention = (" | ").join([tdata[item[1]] for item in [
                [showtime, 0], [period, 1], [daytime, 2]
                ]if item[0] == True])
            if all([
                tdata[4] == True,
                speak == True,
                timestring2 != timestring1,
                ]):
                subprocess.Popen(["espeak", '"'+timestring2+'"', "-s", "130"])
            # [4] edited
            GObject.idle_add(
                self.indicator.set_label,
                mention, self.app,
                priority=GObject.PRIORITY_DEFAULT
                )
            timestring1 = timestring2

    def create_menu(self):
        menu = Gtk.Menu()
        item_quit = Gtk.MenuItem('Quit')
        item_quit.connect('activate', self.stop)
        menu.append(item_quit)
        menu.show_all()
        return menu

    def stop(self, source):
        Gtk.main_quit()

Indicator()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()

วิธีใช้

  1. สคริปต์ต้องการespeak:

    sudo apt-get install espeak
    
  2. คัดลอกทั้งสามไฟล์ด้านบนลงในหนึ่งและไดเรกทอรีเดียวกันชื่อตรงตามที่ระบุไว้ในสคริปต์โมดูลและไอคอน

  3. ในส่วนหัวของสคริปต์ ( moderntimes.py) กำหนดข้อมูลที่ควรแสดงและวิธีการ เพียงแค่ตั้งค่าTrueหรือFalseในบรรทัด:

    # --- define what to show:
    # time = textual time, daytime = a.m./p.m. period = "night"/"morning"/day"/"evening"
    # speak = speak out time every quarter, fuzzy = round time on 5 minutes
    showtime = True; daytime = False; period = True; speak = False; fuzzy = True
  4. ในหัวของโมดูลคุณสามารถเปลี่ยนชั่วโมงเมื่อเริ่มต้นต่อมา ในตอนเช้า , วัน , ยามเย็น , คืนในบรรทัด:

    # --- set starttime of morning, day, evening, night (whole hrs)
    limits = [6, 9, 18, 21]
    # ---
    

    อย่าแตะต้องสิ่งอื่นใดในสคริปต์ตอนนี้ :)

  5. ผู้ใช้ Ubuntu Mateจำเป็นต้องเปิดใช้งานการใช้ตัวบ่งชี้ในระบบของพวกเขา: เลือกระบบ> การตั้งค่า> รูปลักษณ์และความรู้สึก> Mate Tweak> ส่วนต่อประสาน> "เปิดใช้งานตัวชี้วัด"

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

  6. รันตัวบ่งชี้ด้วยคำสั่ง:

    python3 /path/to/moderntimes.py
    

เรียกใช้จากแอปพลิเคชันเริ่มต้น

โปรดจำไว้ว่าหากคุณเรียกใช้คำสั่งจากแอปพลิเคชันเริ่มต้นในหลายกรณีคุณจำเป็นต้องเพิ่มตัวแบ่งเล็กน้อยโดยเฉพาะอย่างยิ่ง (ในหมู่อื่น ๆ ) ในตัวบ่งชี้:

/bin/bash -c "sleep 15 && python3 /path/to/moderntimes.py"

หมายเหตุ

  • ไม่ต้องสงสัยเลยว่าสคริปต์จะมีการเปลี่ยนแปลง / อัปเดตในอีกไม่กี่วันข้างหน้าหลายครั้ง สิ่งหนึ่งที่ฉันต้องการความคิดเห็นเป็นพิเศษคือ "สไตล์" ซึ่งเวลาดิจิทัลถูกแปลงเป็นเวลาแบบข้อความ วิธีที่มันทำตอนนี้:

    • ชั่วโมงทั้งหมดเช่น:

      six o'clock
      
    • น้อยกว่า 30 นาทีหลังจากชั่วโมงเช่น

      twenty past eleven
      
    • 30 นาทีหลังจากชั่วโมงเช่น:

      half past five
      
    • มากกว่า 30 นาทีเช่น:

      twenty to five
      
    • 15 นาทีที่กล่าวถึงquarterเช่น:

      quarter past six
      
    • ข้อยกเว้นคือเที่ยงคืนซึ่งไม่ได้ถูกเรียกzeroแต่midnightเช่น:

      quarter past midnight
      
  • สคริปต์มีน้ำผลไม้เหลือน้อยมากเนื่องจากความจริงที่ว่าหลังจากการตรวจสอบเวลาแรกลูปจะถูกซิงโครไนซ์บนนาฬิกาคอมพิวเตอร์โดยอัตโนมัติ ดังนั้นสคริปต์จะตรวจสอบเวลา / แก้ไขเวลาที่แสดงเพียงหนึ่งครั้งต่อนาทีโดยพักเวลาที่เหลือ


แก้ไข

ตามวันนี้ (2016-4-9) สามารถใช้ ppa ของเวอร์ชั่นขัดมันได้ ในการติดตั้งจาก ppa:

sudo apt-add-repository ppa:vlijm/abouttime
sudo apt-get update
sudo apt-get install abouttime

ช่วงเวลาวันในรุ่นนี้มีการเปลี่ยนแปลงเมื่อเทียบกับเวอร์ชั่นสคริปต์ด้านบนตอนนี้คือ:

morning 6:00-12:00
afternoon 12:00-18:00
evening 18:00-24:00
night 24:00-6:00

... และตัวบ่งชี้มีตัวเลือกที่จะเปลี่ยนไอคอนในช่วงกลางวัน:
เช้า / บ่าย / เย็น / กลางคืน :ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

เป็นที่กล่าวถึงรุ่นนี้ได้รับการทดสอบทั้งสองMate(จากคำถามเดิม) และUnityXubuntu

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


1
ฉันจะบอกว่า: ฟัซซี่หมายความว่าคุณไม่ถูกต้อง ดังนั้น 15:12 ถึง 15:23 หรือจะเป็นไตรมาสที่ผ่านมา 3 ผมว่าจะใช้เพียง: 5/10 / ไตรมาส / ครึ่งที่ผ่านมา / ถึงชั่วโมง มันไม่ได้เรียกว่าฟัซซี่เพื่ออะไร
Rinzwind

อีกคำตอบที่ยอดเยี่ยม ฉันหวังว่าสิ่งนี้จะถูกรวมเข้ากับ PPA ของคุณ .... :)
Parto

@Parto ว้าวขอบคุณอีกครั้ง :) แน่นอนฉันจะสร้าง ppa สำหรับการนี้ :)
จาค็อบ Vlijm

1

หากคุณมี Kubuntu (Plasma Desktop Ubuntu distro) คุณมีวิดเจ็ตในตัวที่เรียกว่า "นาฬิกา fuzzy" - มีรอบอย่างน้อยตั้งแต่ 14.04 หรือนานมาแล้วเมื่อ Plasma 4 หมดและยังคงอยู่ในพลาสมา 5 เท่าที่พบใน Kubuntu 16.04

Fuzzy Clock สามารถตั้งค่าได้ว่า "ถูกต้อง" เพิ่มขึ้นห้านาทีเช่นการอ่านนาฬิกาอะนาล็อก (พูดว่า "สิบหลังจากสี่") แต่ก็มีการตั้งค่า "fuzzier" สามแบบซึ่งหนึ่งในนั้นให้การอ่านเช่น "บ่าย" และอีกอันที่ให้ "Weekend!" (ในบ่ายวันอาทิตย์ - ฉันคิดว่ามันจะพูดว่า "วันจันทร์" ในวันพรุ่งนี้)

ฉันไม่รู้ว่านาฬิกาฟัซซี่มีอยู่ในรสชาติอูบุนตูอื่น ๆ หรือไม่ฉันเห็นมันใน xfce (ตามที่พบใน Xubuntu) บนระบบของฉัน แต่ระบบปฏิบัติการถูกติดตั้งเป็น Kubuntu ดังนั้นฉันไม่แน่ใจว่านาฬิกาฟัซซี่นั้น มีถิ่นกำเนิดใน xfce เช่นเดียวกับ KDE / Plasma และไม่ว่าจะมีอยู่ใน Unity หรือ Mate

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