Нечеткие часы для Ubuntu

9

Давным-давно у меня были часы, чтобы говорить о времени в дневном приложении, как утром, днем, вечером, ночью. Широкий штрих, не очень специфичный, возможно, это был рабочий стол KDE. Я сейчас в Ubuntu Mate, есть ли способ получить это смутное описание времени на панели помощников?

j0h
источник
1
если это помогает, это называют нечеткими часами
Dmiters
Это помогает. :)
j0h
1
Вот исходный код: code.google.com/archive/p/fuzzy-clock Теперь нам нужно @jacobvlijm, чтобы превратить его в приложение>: - D
Rinzwind
Я начал читать Mate-University для создания панельных приложений. Я уверен, что могу запрограммировать что-то вроде этого, но я понятия не имею, как сделать это панельным приложением
j0h
1
это было в KDE, я в этом уверен, и также было переведено!
Antek

Ответы:

15

Текстовые / говорящие часы для Mate и других вариантов Ubuntu

Хотя изначально вопрос был об Ubuntu Mate , к счастью, с 15.10 также можно использовать индикаторыMate . В результате ответ ниже по крайней мере работает для Unityи Mateи (проверено) на Xubuntu.

Графический интерфейс для изменения настроек все еще используется (работает над ним), но я проверил показанный ниже индикатор в течение как минимум 20 часов, и (как и ожидалось) он выполнил работу без ошибок.

Опции

Индикатор предлагает следующие варианты:

  • Показать текстовое время

    введите описание изображения здесь

  • Показать текстовое «день-зона» ( ночь , утро , день , вечер )

    введите описание изображения здесь

  • Показать утра / вечера

    введите описание изображения здесь

  • Показать все сразу (или любую комбинацию из трех)

    введите описание изображения здесь

  • Говорите время каждую четверть часа ( 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()

Как пользоваться

  1. Скрипт нуждается в espeak:

    sudo apt-get install espeak
    
  2. Скопируйте все три вышеупомянутых файла в один и тот же каталог с точным именем, как указано в Сценарии, модуле и значке.

  3. В заголовке скрипта ( 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
  4. В заголовке модуля вы можете поменять часы, когда следует запускать утро , день , вечер , ночь , в строке:

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

    Пока не трогайте ничего в сценарии :)

  5. Пользователям Ubuntu Mate необходимо включить использование индикаторов в своей системе: выберите «Система»> «Установки»> «Внешний вид»> «Настройка Mate»> «Интерфейс»> «Включить индикаторы».

    введите описание изображения здесь

  6. Запустите индикатор с помощью команды:

    python3 /path/to/moderntimes.py
    

Запуск его из запуска приложений

Помните, что если вы запускаете команду из Startup Applications, во многих случаях вам нужно добавить небольшой перерыв, особенно (среди прочего) в отношении индикаторов:

/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
      
  • В сценарии очень мало сока, потому что после первой проверки по времени цикл автоматически синхронизируется на часах компьютера. Поэтому скрипт проверяет время / редактирует отображаемое время только один раз в минуту, а остальное время спит.


редактировать

На сегодняшний день (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.

введите описание изображения здесь

Якоб Влейм
источник
1
Я бы сказал: нечеткий означает, что вы можете быть неточным. Таким образом, с 15:12 до 15:23 или около того будет четверть третьего. Я бы сказал, просто используйте: 5/10 / четверть / половина часа / час. Это не называется нечетким даром.
Ринзвинд
Еще один потрясающий ответ. Я надеюсь, что это интегрируется в ваш PPA .... :)
Parto
@Parto вау спасибо еще раз :) Я определенно создам ppa для этого :)
Jacob Vlijm
1

Если у вас есть Kubuntu (дистрибутив Plasma Desktop Ubuntu), у вас есть встроенный виджет под названием «Нечеткие часы» - он существует по крайней мере с 14.04, или так же давно, как и Plasma 4, и до сих пор в Plasma 5. как найдено в Kubuntu 16.04.

Нечеткие часы можно установить так, чтобы они были «точными» с шагом в пять минут, подобно чтению аналоговых часов (скажем, «десять за четырьмя»), но у них также есть три «нечетких» настройки, одна из которых дает показания типа «день» и тот, который просто дает "Выходные!" (в воскресенье днем ​​- я полагаю, завтра скажут "понедельник").

Я не знаю, есть ли нечеткие часы в других версиях Ubuntu - я видел их в xfce (как в Xubuntu) на моей системе, но ОС была установлена ​​как Kubuntu, поэтому я не уверен, что нечеткие часы родной для xfce, а также для KDE / Plasma и не доступен ли он в Unity или Mate.

Zeiss Ikon
источник