很久以前,我曾将时钟设置为在面板应用中显示诸如早晨、白天、晚上、夜晚之类的时间。大致如此,不是很具体,它可能是一个 KDE 桌面。我现在使用的是 Ubuntu Mate,有没有办法在 Mate 面板中获取这种模糊的时间描述?
答案1
Mate 的文字/语音时钟和其他 Ubuntu 版本
虽然问题最初是关于Ubuntu 伴侣幸运的是,从 15.10 开始,指标也可以使用Mate
。因此,下面的答案至少适用于Unity
和Mate
并且 (已测试) Xubuntu
。
用于更改设置的 GUI 仍有待遵循(正在进行中),但我对下面的指标进行了至少 20 小时的测试,并且(正如预期的那样)它完成了工作而没有出现错误。
选项
该指标提供以下选项:
显示文本时间
显示文本“day-area”(夜晚,早晨,天,晚上)
显示上午 / 下午
一次显示所有内容(或三者的任意组合)
说出时间每季度一小时(
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()
如何使用
该脚本需要
espeak
:sudo apt-get install espeak
将上述所有三个文件复制到同一个目录中,名称与脚本、模块和图标
在脚本(
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
在模块,您可以更改随后开始的时间 早晨,天,晚上,夜晚,位于以下行:
# --- set starttime of morning, day, evening, night (whole hrs) limits = [6, 9, 18, 21] # ---
暂时不要触碰脚本中的任何其他内容:)
Ubuntu Mate 用户需要在系统上启用指示器:选择“系统”>“首选项”>“外观和感觉”>“Mate 调整”>“界面”>“启用指示器”
使用以下命令运行指标:
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- 循环之后,循环会自动与计算机时钟同步。因此,该脚本每分钟仅检查一次时间/编辑显示的时间,其余时间处于休眠状态。
编辑
截至今天 (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
。
答案2
如果您拥有 Kubuntu(Plasma Desktop Ubuntu 发行版),那么您就会有一个名为“模糊时钟”的内置小部件 - 它至少从 14.04 开始就已经存在,或者和 Plasma 4 问世一样久远,并且它仍然存在于 Plasma 5 中,可以在 Kubuntu 16.04 中找到。
模糊时钟可以设置为像读取模拟时钟一样“精确”到五分钟的增量(例如“四点十分”),但它还有三个“更模糊”的设置,其中一个设置给出“下午”之类的读数,另一个设置只给出“周末!”(在星期天下午 - 我猜明天会说“星期一”)。
我不知道模糊时钟是否在其他 Ubuntu 版本中可用——我在我的系统上的 xfce 中看到了它(在 Xubuntu 中发现),但操作系统是作为 Kubuntu 安装的,所以我不确定模糊时钟是否是 xfce 以及 KDE/Plasma 原生的,也不确定它是否在 Unity 或 Mate 中可用。