Jam tekstual / berbicara untuk Mate dan varian Ubuntu lainnya
Meskipun pertanyaan awalnya tentang Ubuntu Mate , untungnya, mulai pukul 15.10, indikator dapat digunakan Mate
juga. Akibatnya, jawaban di bawah setidaknya berfungsi untuk Unity
dan Mate
dan (diuji) pada Xubuntu
.
GUI untuk mengubah pengaturan masih akan mengikuti (mengerjakannya), tapi saya menguji indikator di bawah ini selama setidaknya 20 jam, dan (seperti yang diharapkan) itu melakukan pekerjaan tanpa kesalahan.
Pilihan
Indikator menawarkan opsi berikut:
Tampilkan waktu tekstual
Tampilkan "area-hari" tekstual ( malam , pagi , siang , malam )
Tunjukkan pagi / sore
Perlihatkan semuanya sekaligus (atau kombinasi ketiganya)
Ucapkan waktu setiap seperempat jam ( espeak
wajib)
Secara opsional, waktu ditampilkan fuzzy ; dibulatkan pada lima menit, mis.
10:43 -> quarter to eleven
.
Script, modul dan ikon
Solusinya ada skrip, modul terpisah dan ikon, yang perlu Anda simpan dalam satu dan direktori yang sama .
Ikon:
Klik kanan dan simpan sebagai (tepatnya) indicator_icon.png
Modul:
Ini adalah modul yang menghasilkan waktu tekstual dan semua informasi yang ditampilkan lainnya. Salin kode, simpan sebagai (lagi, persis ) tcalc.py
, bersama dengan ikon di atas dalam satu dan direktori yang sama .
#!/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]
Naskah:
Ini adalah indikator yang sebenarnya. Salin kode, simpan sebagai moderntimes.py
, bersama dengan ikon dan modul di atas dalam satu dan direktori yang sama .
#!/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()
Cara Penggunaan
Kebutuhan skrip espeak
:
sudo apt-get install espeak
Salin ketiga file di atas ke dalam satu dan direktori yang sama, persis dinamai seperti yang ditunjukkan dalam Skrip, modul, dan ikon
Di kepala skrip ( moderntimes.py
), tentukan informasi mana yang harus ditampilkan, dan bagaimana. Cukup atur True
atau False
di baris:
# --- 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
Di kepala modul , Anda dapat mengubah jam kapan memulai selanjutnya pagi , siang , sore , malam , di baris:
# --- set starttime of morning, day, evening, night (whole hrs)
limits = [6, 9, 18, 21]
# ---
Jangan menyentuh apa pun di skrip untuk saat ini :)
Pengguna Ubuntu Mate perlu mengaktifkan penggunaan indikator pada sistem mereka: pilih System> Preferences> Look and feel> Mate tweak> Antarmuka> "Aktifkan indikator"
Jalankan indikator dengan perintah:
python3 /path/to/moderntimes.py
Menjalankannya dari Aplikasi Startup
Ingat bahwa jika Anda menjalankan perintah dari Aplikasi Startup, dalam banyak kasus Anda perlu menambahkan sedikit istirahat, terutama (antara lain) pada indikator:
/bin/bash -c "sleep 15 && python3 /path/to/moderntimes.py"
Catatan
Tidak diragukan lagi skrip akan diubah / diperbarui dalam beberapa hari ke depan berkali-kali. Satu hal yang saya suka umpan balik pada khususnya adalah "gaya" di mana waktu digital diubah menjadi waktu tekstual. Cara itu dilakukan sekarang:
jam penuh, misalnya:
six o'clock
kurang dari 30 menit setelah jam kerja, mis
twenty past eleven
30 menit setelah jam mis:
half past five
lebih 30 menit misalnya:
twenty to five
15 menit disebutkan quarter
, misalnya:
quarter past six
pengecualian adalah tengah malam, yang tidak disebut zero
, tetapi midnight
, misalnya:
quarter past midnight
Skripnya sangat rendah jus, karena fakta bahwa setelah loop timecheck pertama, loop disinkronkan pada jam komputer secara otomatis. Oleh karena itu skrip memeriksa waktu / mengedit waktu yang ditampilkan hanya sekali per menit, tidur sisa waktu.
Edit
Per hari ini (2016-4-9), ppa dari versi yang dipoles tersedia. Untuk menginstal dari ppa:
sudo apt-add-repository ppa:vlijm/abouttime
sudo apt-get update
sudo apt-get install abouttime
Periode hari dalam versi ini diubah, dibandingkan dengan versi skrip di atas, sekarang adalah:
morning 6:00-12:00
afternoon 12:00-18:00
evening 18:00-24:00
night 24:00-6:00
... dan indikator memiliki opsi untuk mengubah ikon di siang hari:
pagi / siang / malam / malam :
Seperti disebutkan, versi ini diuji pada keduanya Mate
(dari pertanyaan awal) Unity
dan Xubuntu
.