Mate ve diğer Ubuntu varyantları için metin / konuşma saati
Soru aslen Ubuntu Mate ile ilgili olmasına rağmen , neyse ki, 15.10'dan itibaren göstergeler de kullanılabilir Mate
. Sonuç olarak, aşağıda cevap en az çalışır Unity
ve Mate
ve üzerinde (test) Xubuntu
.
Ayarları değiştirmek için bir GUI hala takip ediliyor (üzerinde çalışıyor), ancak aşağıdaki göstergeyi en az 20 saat boyunca test ettim ve (beklendiği gibi) işi hatasız yaptı.
Seçenekler
Gösterge aşağıdaki seçenekleri sunar:
Metin zamanını göster
Metinsel "gündüz alanı" nı göster ( gece , sabah , gün , akşam )
Öö / ös
Hepsini bir kerede göster (veya üçünün herhangi bir kombinasyonunu)
Bir saatin her çeyreğinde zamanı söyleyin ( espeak
zorunlu)
İsteğe bağlı olarak, zaman bulanık görüntülenir ; beş dakika boyunca yuvarlandı, örneğin
10:43 -> quarter to eleven
.
Komut dosyası, modül ve bir simge
Çözüm, bir komut dosyası, ayrı bir modül ve bir ve aynı dizinde depolamanız gereken bir simge var .
Simge:
Üzerine sağ tıklayıp kaydedin (tam olarak) indicator_icon.png
Modül:
Bu, metin zamanını ve görüntülenen diğer tüm bilgileri üreten modüldür. Kodu kopyalayın, yukarıdaki simgeyle birlikte bir ve aynı dizine (tekrar, tam olarak ) kaydedin .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]
Senaryo:
Bu gerçek göstergedir. Kodu kopyalayın, moderntimes.py
yukarıdaki simge ve th modülü ile birlikte bir ve aynı dizine kaydedin .
#!/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()
Nasıl kullanılır
Betiğin ihtiyacı espeak
:
sudo apt-get install espeak
Yukarıdaki üç dosyayı da Komut dosyasında, modülde ve bir simgede gösterildiği gibi adlandırılmış bir ve aynı dizine kopyalayın
Komut dosyasının ( moderntimes.py
) başında, hangi bilgilerin görüntüleneceğini ve nasıl yapılacağını tanımlayın. Basitçe ayarlayın True
veya False
hatta:
# --- 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
Başkanı olarak modülüne sonradan ne zaman başlatılacağını, sen saat değiştirebilir sabah , gün , akşam , gece hattında,:
# --- set starttime of morning, day, evening, night (whole hrs)
limits = [6, 9, 18, 21]
# ---
Şimdilik komut dosyasında başka bir şeye dokunma :)
Ubuntu Mate kullanıcılarının sistemlerinde göstergelerin kullanımını etkinleştirmesi gerekir: Sistem> Tercihler> Bak ve hisset> Mate ayarları> Arayüz> "Göstergeleri etkinleştir" i seçin
Göstergeyi şu komutla çalıştırın:
python3 /path/to/moderntimes.py
Başlangıç Uygulamalarından Çalıştırma
Komutu Başlangıç Uygulamaları'ndan çalıştırırsanız, çoğu durumda, özellikle (diğerleri arasında) göstergelere biraz mola eklemeniz gerektiğini unutmayın:
/bin/bash -c "sleep 15 && python3 /path/to/moderntimes.py"
notlar
Şüphesiz, senaryo önümüzdeki birkaç gün içinde birçok kez değiştirilecek / güncellenecektir. Özellikle geri bildirimde bulunmak istediğim bir şey, dijital zamanın metinsel zamana dönüştürüldüğü "stil" dir. Şimdi yapılış şekli:
tüm saatler, örneğin:
six o'clock
saatten sonra 30 dakikadan az, ör.
twenty past eleven
30 dakika sonra örneğin:
half past five
30 dakikadan fazla örneğin:
twenty to five
15 dakika bahsedildi quarter
, örneğin:
quarter past six
istisna, çağrılmayan zero
, ancak midnight
örneğin:
quarter past midnight
İlk zaman kontrol döngüsünden sonra, döngünün bilgisayar saatinde otomatik olarak senkronize edilmesi nedeniyle, komut dosyası suyunda son derece düşüktür. Bu nedenle komut dosyası zamanı kontrol eder / görüntülenen zamanı dakikada bir kez düzenler ve kalan süreyi düzenler.
Düzenle
Bugün (2016-4-9) uyarınca, cilalı versiyonun bir ppa mevcuttur. Ppa'dan yüklemek için:
sudo apt-add-repository ppa:vlijm/abouttime
sudo apt-get update
sudo apt-get install abouttime
Bu sürümdeki gün periyotları, yukarıdaki komut dosyası sürümüne kıyasla değiştirildi, şimdi:
morning 6:00-12:00
afternoon 12:00-18:00
evening 18:00-24:00
night 24:00-6:00
... ve göstergenin gündüz simgesini değiştirme seçeneği vardır:
sabah / öğleden sonra / akşam / gece :
Belirtildiği gibi, bu sürüm hem test edildi Mate
(orijinal soruya itibaren) Unity
ve Xubuntu
.