Ubuntu的模糊时钟


9

很久以前,我的时钟设置为在面板应用程序中说一些时间,例如早上,白天,晚上,晚上。粗笔,不是很具体,可能是KDE桌面。我现在在Ubuntu Mate中,有没有办法在mate面板中获得这个模糊的时间描述?


1
如果有帮助,这称为模糊时钟
Dmiters

确实有帮助。:)
j0h

1
这是源代码:code.google.com/archive/p/fuzzy-clock 现在我们需要@jacobvlijm使其成为应用程序>:-D
Rinzwind

我开始阅读Mate-University制作面板应用程序。我确定我可以
编写

1
我确定这是在KDE中进行的,并且也已翻译!
Antek

Answers:


15

Mate 其他Ubuntu变体的文字/语音时钟

尽管问题最初是关于Ubuntu Mate的,但幸运的是,从15.10开始,指标也可以使用Mate。其结果是,下面的答案至少适用于UnityMate和(测试)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)的开头,定义应显示哪些信息以及如何显示。只需设置TrueFalse在线:

    # --- 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调整>界面>“启用指示器”

    在此处输入图片说明

  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
      
  • 由于在第一个timecheck-loop之后,该循环会自动在计算机时钟上同步,因此该脚本的使用率极低。因此,脚本每分钟仅检查一次时间/编辑一次显示的时间,其余时间处于休眠状态。


编辑

根据今天(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(来自原始问题)Unity和上进行了测试Xubuntu

在此处输入图片说明


1
我会说:模糊意味着您可能不准确。所以15:12到15:23大约是3点30分。我想说的是:5/10/1/4 /半点/一小时。这不是所谓的模糊。
Rinzwind

另一个很棒的答案。我希望这能集成到您的PPA中。...:)
Parto

@Parto再次感谢:)我一定会为此创建一个ppa :)
Jacob Vlijm '16

1

如果您拥有Kubuntu(Plasma Desktop Ubuntu发行版),则您有一个内置的名为“ fuzzy clock”的小部件-至少从14.04开始,或者早在Plasma 4推出后,它就一直存在,并且仍然在Plasma 5中如Kubuntu 16.04中所述。

可以将模糊时钟设置为“准确”,以五分钟为增量,类似于读取模拟时钟(例如,“十点四”),但是它也具有三个“更模糊”的设置,其中之一提供诸如“下午”的读数。还有一个只给“周末!” (在星期天的下午-我想明天会说“星期一”)。

我不知道其他Ubuntu版本是否提供模糊时钟-我在系统上的xfce中(如在Xubuntu中找到的)看到了它,但操作系统已安装为Kubuntu,所以我不确定模糊时钟是否为xfce以及KDE / Plasma本身就是本机,无论它在Unity还是Mate中都可用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.