Fuzzy-Clock dla Ubuntu

9

Dawno temu miałem ustawiony zegar, który mówi coś takiego jak rano, dzień, wieczór, noc, czas w aplikacji panelowej. Szeroki skok, niezbyt konkretny, mógł to być pulpit KDE. Jestem teraz w Ubuntu Mate, czy istnieje sposób, aby uzyskać ten niejasny opis czasu w panelu wiązania?

j0h
źródło
1
jeśli to pomaga, nazywa się to rozmytym zegarem
Dmiters
To pomaga. :)
j0h
1
Oto kod źródłowy: code.google.com/archive/p/fuzzy-clock Teraz potrzebujemy @jacobvlijm, aby zrobić z niego aplikację>: - D
Rinzwind
Zacząłem czytać Mate-University na temat tworzenia aplikacji panelowych. Jestem pewien, że mogę zaprogramować coś takiego, ale nie mam pojęcia, jak zrobić z niego aplikację
panelową
1
to było w KDE, jestem tego pewien i zostało również przetłumaczone!
Antek

Odpowiedzi:

15

Zegar tekstowy / mówiony dla Mate i innych wariantów Ubuntu

Chociaż pierwotnie pytanie dotyczyło Ubuntu Mate , na szczęście od 15.10 wskaźniki mogą być również używane Mate. W rezultacie, odpowiedź poniżej przynajmniej pracuje Unityi Matei (testowane) na Xubuntu.

Interfejs GUI do zmiany ustawień jest jeszcze do wykonania (pracuje nad nim), ale testowałem poniższy wskaźnik przez co najmniej 20 godzin i (zgodnie z oczekiwaniami) wykonał pracę bez błędu.

Opcje

Wskaźnik oferuje następujące opcje:

  • Pokaż czas tekstu

    wprowadź opis zdjęcia tutaj

  • Pokaż tekstowy „obszar dnia” ( noc , poranek , dzień , wieczór )

    wprowadź opis zdjęcia tutaj

  • Pokaż rano / po południu

    wprowadź opis zdjęcia tutaj

  • Pokaż je wszystkie naraz (lub dowolną kombinację trzech)

    wprowadź opis zdjęcia tutaj

  • Wypowiadaj głos co kwadrans ( espeakwymagane)

  • Opcjonalnie czas jest wyświetlany rozmazany ; zaokrąglone w ciągu pięciu minut, np.
    10:43 -> quarter to eleven.

Skrypt, moduł i ikona

Istnieje rozwiązanie skryptu, osobnego modułu i ikony, które należy przechowywać w jednym i tym samym katalogu .

Ikona:

wprowadź opis zdjęcia tutaj

Kliknij prawym przyciskiem myszy i zapisz jako (dokładnie) indicator_icon.png

Moduł:

Jest to moduł, który generuje czas tekstowy i wszystkie inne wyświetlane informacje. Skopiuj kod, zapisz go (ponownie dokładnie ) tcalc.pywraz z ikoną powyżej w jednym i tym samym katalogu .

#!/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]

Scenariusz:

To jest rzeczywisty wskaźnik. Skopiuj kod, zapisz go jako moderntimes.pywraz z ikoną i powyższym modułem w jednym i tym samym katalogu .

#!/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()

Jak używać

  1. Skrypt potrzebuje espeak:

    sudo apt-get install espeak
    
  2. Skopiuj wszystkie trzy pliki powyżej do jednego i tego samego katalogu o dokładnie takiej nazwie, jak wskazano w Skrypcie, module i ikonie

  3. W nagłówku skryptu ( moderntimes.py) określ, które informacje powinny być wyświetlane i jak. Po prostu ustaw Truelub Falsew linii:

    # --- 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. W nagłówku modułu możesz zmienić godziny rozpoczęcia następnego dnia rano , w dzień , wieczorem , w nocy :

    # --- set starttime of morning, day, evening, night (whole hrs)
    limits = [6, 9, 18, 21]
    # ---
    

    Na razie nie dotykaj niczego innego w skrypcie :)

  5. Użytkownicy systemu Ubuntu Mate muszą włączyć korzystanie ze wskaźników w swoim systemie: wybierz System> Preferencje> Wygląd i działanie> Ulepszenie wiązania> Interfejs> „Włącz wskaźniki”

    wprowadź opis zdjęcia tutaj

  6. Uruchom wskaźnik za pomocą polecenia:

    python3 /path/to/moderntimes.py
    

Uruchamianie go z aplikacji startowych

Pamiętaj, że jeśli uruchomisz polecenie z aplikacji startowych, w wielu przypadkach musisz dodać małą przerwę, szczególnie (między innymi) na wskaźnikach:

/bin/bash -c "sleep 15 && python3 /path/to/moderntimes.py"

Notatki

  • Bez wątpienia skrypt będzie zmieniany / aktualizowany wiele razy w ciągu kilku następnych dni. Jedną rzeczą, na którą chciałbym zwrócić szczególną uwagę, jest „styl”, w którym czas cyfrowy jest konwertowany na czas tekstowy. Sposób, w jaki to się teraz robi:

    • całe godziny, np .:

      six o'clock
      
    • mniej niż 30 minut po godzinie, np

      twenty past eleven
      
    • 30 minut po godzinie, np .:

      half past five
      
    • więcej 30 minut np .:

      twenty to five
      
    • Wymieniono 15 minut quarter, np .:

      quarter past six
      
    • wyjątkiem jest północ, która nie jest wywoływana zero, ale midnightnp .:

      quarter past midnight
      
  • Skrypt ma bardzo niski poziom soku, ponieważ po pierwszej pętli kontroli czasu pętla jest automatycznie synchronizowana z zegarem komputera. Dlatego skrypt sprawdza czas / edytuje wyświetlany czas tylko raz na minutę, pozostawiając resztę czasu.


Edytować

Na dzień dzisiejszy (2016-4-9) dostępna jest ppa wypolerowanej wersji. Aby zainstalować z ppa:

sudo apt-add-repository ppa:vlijm/abouttime
sudo apt-get update
sudo apt-get install abouttime

Okresy w tej wersji zostały zmienione w porównaniu do powyższej wersji skryptu, teraz jest to:

morning 6:00-12:00
afternoon 12:00-18:00
evening 18:00-24:00
night 24:00-6:00

... a wskaźnik ma opcję zmiany ikony w ciągu dnia:
rano / popołudnie / wieczór / noc :wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Jak wspomniano, ta wersja została przetestowana zarówno na Mate(pierwotne pytanie), jak Unityi Xubuntu.

wprowadź opis zdjęcia tutaj

Jacob Vlijm
źródło
1
Powiedziałbym: rozmyte oznacza, że ​​możesz być niedokładny. Tak więc od 15:12 do 15:23 będzie kwadrans po trzeciej. Powiem po prostu: 5/10 / kwadrans / pół do godziny. Nie bez powodu nazywa się to rozmytym.
Rinzwind
Jeszcze jedna niesamowita odpowiedź. Mam nadzieję, że zostanie to zintegrowane z Twoim PPA .... :)
Parto
@Parto wow jeszcze raz dziękuję :) Na pewno stworzę ppa dla tego :)
Jacob Vlijm
1

Jeśli korzystasz z Kubuntu (dystrybucja Ubuntu Desktop Plazmy), masz wbudowany widżet o nazwie „zegar rozmyty” - istnieje on od co najmniej 14.04, lub tak dawno, jak nie było Plazmy 4 i wciąż jest w Plazmie 5 jak znaleziono w Kubuntu 16.04.

Zegar rozmyty może być ustawiony na „dokładność” co pięć minut, na przykład czytanie zegara analogowego (powiedzmy „dziesięć po czwartej”), ale ma również trzy ustawienia „zamglenia”, z których jedno daje odczyty takie jak „popołudnie” i taki, który daje po prostu „Weekend!” (w niedzielne popołudnie - przypuszczam, że jutro powie „poniedziałek”).

Nie wiem, czy zegar rozmyty jest dostępny w innych wersjach Ubuntu - widziałem go w Xfce (jak w Xubuntu) w moim systemie, ale system operacyjny został zainstalowany jako Kubuntu, więc nie jestem pewien, czy zegar rozmyty jest natywny dla Xfce, a także KDE / Plazmy, ani czy jest dostępny w Unity czy Mate.

Zeiss Ikon
źródło