Đồng hồ văn bản / nói cho Mate và các biến thể Ubuntu khác
Mặc dù câu hỏi ban đầu là về Ubuntu Mate , nhưng may mắn thay, từ 15.10, các chỉ số cũng có thể được sử dụng Mate
. Kết quả là, câu trả lời dưới đây ít nhất hoạt động cho Unity
và Mate
và (đã kiểm tra) trên Xubuntu
.
Một GUI để thay đổi cài đặt vẫn phải tuân theo (hoạt động trên nó), nhưng tôi đã thử nghiệm chỉ báo bên dưới trong ít nhất 20 giờ và (như mong đợi) nó đã thực hiện công việc mà không gặp lỗi.
Tùy chọn
Chỉ báo cung cấp các tùy chọn sau:
Hiển thị thời gian văn bản
Hiển thị văn bản "khu vực ban ngày" ( đêm , sáng , ngày , tối )
Hiển thị sáng / chiều
Hiển thị tất cả chúng cùng một lúc (hoặc bất kỳ kết hợp nào của ba)
Nói ra thời gian mỗi quý một giờ ( espeak
bắt buộc)
Tùy chọn, thời gian được hiển thị mờ ; làm tròn trên năm phút, ví dụ
10:43 -> quarter to eleven
.
Kịch bản, mô-đun và một biểu tượng
Giải pháp tồn tại của một tập lệnh, một mô-đun riêng biệt và một biểu tượng mà bạn cần lưu trữ trong một và cùng một thư mục .
Biểu tượng:
Phải bấm vào nó và lưu nó dưới dạng (chính xác) indicator_icon.png
Các mô-đun:
Đây là mô-đun tạo ra thời gian văn bản và tất cả các thông tin được hiển thị khác. Sao chép mã, lưu nó dưới dạng (một lần nữa, chính xác ) tcalc.py
, cùng với biểu tượng ở trên trong cùng một thư mục .
#!/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]
Kịch bản:
Đây là chỉ số thực tế. Sao chép mã, lưu nó dưới dạng moderntimes.py
, cùng với biểu tượng và mô-đun ở trên trong một và cùng một thư mục .
#!/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()
Cách sử dụng
Kịch bản cần espeak
:
sudo apt-get install espeak
Sao chép tất cả ba tệp ở trên vào một và cùng một thư mục, được đặt tên chính xác như được chỉ định trong Tập lệnh, mô-đun và biểu tượng
Trong phần đầu của tập lệnh ( moderntimes.py
), xác định thông tin nào sẽ được hiển thị và cách thực hiện. Đơn giản chỉ cần đặt True
hoặc False
trong dòng:
# --- 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
Trong phần đầu của mô-đun , bạn có thể thay đổi giờ khi bắt đầu sau đó sáng , ngày , tối , đêm , trong dòng:
# --- set starttime of morning, day, evening, night (whole hrs)
limits = [6, 9, 18, 21]
# ---
Đừng chạm vào bất cứ điều gì khác trong kịch bản bây giờ :)
Người dùng Ubuntu Mate cần cho phép sử dụng các chỉ báo trên hệ thống của họ: chọn Hệ thống> Tùy chọn> Giao diện> Điều chỉnh Mate> Giao diện> "Bật chỉ báo"
Chạy chỉ báo bằng lệnh:
python3 /path/to/moderntimes.py
Chạy nó từ các ứng dụng khởi động
Hãy nhớ rằng nếu bạn chạy lệnh từ Ứng dụng khởi động, trong nhiều trường hợp, bạn cần thêm một chút nghỉ, đặc biệt (trong số những người khác) trên các chỉ báo:
/bin/bash -c "sleep 15 && python3 /path/to/moderntimes.py"
Ghi chú
Không có nghi ngờ kịch bản sẽ được thay đổi / cập nhật trong vài ngày tới nhiều lần. Một điều tôi muốn phản hồi cụ thể là "phong cách" trong đó thời gian kỹ thuật số được chuyển đổi thành thời gian văn bản. Cách nó được thực hiện bây giờ:
cả giờ, vd:
six o'clock
ít hơn 30 phút sau giờ, vd
twenty past eleven
30 phút sau giờ, ví dụ:
half past five
hơn 30 phút, vd:
twenty to five
15 phút được đề cập quarter
, ví dụ:
quarter past six
ngoại lệ là nửa đêm, không được gọi zero
, nhưng midnight
, vd:
quarter past midnight
Kịch bản cực kỳ ít nước trái cây, do thực tế là sau vòng lặp thời gian đầu tiên, vòng lặp được đồng bộ hóa trên đồng hồ máy tính tự động. Do đó, tập lệnh kiểm tra thời gian / chỉnh sửa thời gian hiển thị chỉ một lần mỗi phút, ngủ phần còn lại của thời gian.
Biên tập
Theo ngày hôm nay (2016-4-9), một ppa của phiên bản được đánh bóng có sẵn. Để cài đặt từ ppa:
sudo apt-add-repository ppa:vlijm/abouttime
sudo apt-get update
sudo apt-get install abouttime
Các khoảng thời gian trong ngày trong phiên bản này được thay đổi, so với phiên bản tập lệnh ở trên, bây giờ là:
morning 6:00-12:00
afternoon 12:00-18:00
evening 18:00-24:00
night 24:00-6:00
... và chỉ báo có tùy chọn tho để thay đổi biểu tượng vào ban ngày:
sáng / chiều / tối / đêm :
Như đã đề cập, phiên bản này đã được thử nghiệm trên cả hai Mate
(từ câu hỏi ban đầu) Unity
và Xubuntu
.