Можно ли в окне обратного отсчета показывать время до следующей приостановки?

Иногда я оставляю свой компьютер без работы, когда мне нужно куда-то идти, но я оставляю его с людьми, которым я абсолютно доверяю, и я скоро вернусь, поэтому нет реальной необходимости приостанавливать работу (например, если это семья, и я просто выскакиваю на Ло, который находится на небольшом расстоянии от моего места, и вы знаете, не всегда удобно останавливать мою машину, когда это так), или могут быть другие причины, почему я хочу этого, например, знать, должен ли я бежать к своему машина, чтобы шевелить мышью перед тем, как она засыпает, или если я могу пойти к компьютеру медленнее.

В любом случае, чтобы добраться до сути, я хотел бы иметь возможность запустить обратный отсчет (предпочтительно в прозрачном окне (бит сквозного просмотра не является обязательным) поверх всего в верхнем правом углу. моего экрана чуть ниже верхней панели), который покажет мне обратный отсчет до следующего времени ожидания.

Это может либо сбрасывать таймер каждый раз, когда я взаимодействую с машиной, либо каким-либо образом напрямую взаимодействовать с системой приостановки, чтобы сообщить, когда наступает следующая приостановка (потому что я предполагаю, что есть какой-то обратный отсчет). Как можно добиться чего-то подобного (конечно, я бы не хотел, чтобы окно всегда было открыто, но вместо этого я мог запускать команду в любое время, которое будет запускать окно, или это может быть даже обратный отсчет в окне терминала). что я просто переместился бы или был бы автоматически расположен в верхнем правом углу, если бит GUI вообще проблематичен)?

Я использую Ubuntu GNOME 15.10 с GNOME 3.18, но решение также должно работать с Ubuntu GNOME 16.04 с GNOME 3.20, как я планирую в ближайшее время.

1
задан 25 April 2016 в 13:25

2 ответа

Править

В исходном ответе, далее ниже, окно обратного отсчета появилось после произвольного времени простоя. Пере - чтение Вашего вопроса, Вы могли бы хотеть это постоянно. Постоянная версия ниже (который более прост), исходный ответ далее вниз.


1a. Версия, постоянно показывая время обратного отсчета

Решением является фоновый сценарий, показывая полу - прозрачное окно обратного отсчета. Окно ведет себя как уведомление: это всегда видимо на вершине, но (конечно) можно работать в других окнах, как обычно:

enter image description here enter image description here enter image description here enter image description here

Начальное время является временем простоя, прежде чем приостановят, должен быть активирован. Время сбрасывается на мыши - события клавиатуры.

Поскольку изображение показывает, сценарий идет отличающийся пред - параметры цвета набора (см. далее ниже).

Как установить

  1. Потребности сценария xprintidle:

    sudo apt-get install xprintidle
    
  2. Скопируйте сценарий ниже в пустой файл, сохраните его как countdown.py
  3. Выполните его со временем простоя как аргумент:

    python3 /path/to/countdown.py <idle_time>
    

    например.

    python3 /path/to/countdown.py 300
    

    для ввода приостанавливают после 5 минут.

  4. Если все хорошо работает, добавьте его для запущения приложений: Тире> Приложения Запуска> Добавляет. Добавьте команду:

     /path/to/runner.py <idle_time>
    

Сценарий

#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk, GObject, Pango
from threading import Thread
import subprocess
import time
import signal
import sys
import os

# --- set the color (index) below (1 is the first)
color = 1
# ---
textcolors = ["grey", "orange", "green", "blue", "white"]
# --- don't change anything below
txtcolor = textcolors[color-1]

countdown = int(sys.argv[1])
susp = os.path.dirname(os.path.realpath(__file__))+"/susp.sh"

class CountDown(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self)
        maingrid = Gtk.Grid()
        self.add(maingrid)
        maingrid.set_border_width(40)
        # set initial text for the spash window
        self.label = Gtk.Label(convert_seconds(countdown))
        self.label.modify_font(Pango.FontDescription('Ubuntu 22'))
        self.label.set_width_chars(10) 
        maingrid.attach(self.label, 0, 0, 1, 1)
        self.update = Thread(target=self.start_countdown, args=[countdown])
        # daemonize the thread
        self.update.setDaemon(True)
        self.update.start()

    def start_countdown(self, countdown):
        idle1 = idletime()
        t = countdown
        while True:
            time.sleep(1)
            idle2 = idletime()
            if idle2 < idle1:
                t = countdown
            else:
                t -= 1
            if t <= 0:
                subprocess.Popen(["systemctl", "suspend"])
            GObject.idle_add(self.label.set_text, convert_seconds(t),
                priority=GObject.PRIORITY_DEFAULT)
            idle1 = idle2

    def stop(self):
        Gtk.main_quit()

def get_screen():
    scr = [s.split("x") for s in subprocess.check_output([
        "xrandr"]).decode("utf-8").split() if "+0+0" in s][0]
    return int(scr[0]) - 300

def convert_seconds(sec):
    timedisplay = [
        str(int(sec/3600)),
        str(int((sec % 3600)/60)),
        str(int(sec % 60)),
        ]
    for i, n in enumerate(timedisplay):
        if len(n) == 1:
            timedisplay[i] = "0"+n
    return ":".join(timedisplay)

def idletime():
    return int(subprocess.check_output(
        "xprintidle"
        ).decode("utf-8").strip())/1000

def splashwindow():
    window = CountDown()
    window.set_decorated(False)
    window.set_resizable(False)
    window.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0,0,0,1))
    window.modify_fg(Gtk.StateFlags.NORMAL, Gdk.color_parse(txtcolor))
    window.set_opacity(0.6)
    window.move(get_screen(), 80)
    window.set_keep_above(True)
    window.show_all()
    Gtk.main()

GObject.threads_init()
splashwindow()

Примечание:

Цвет текста может быть изменен, как объяснено в самой нижней части второй версии ответа.

1b. Согласно просьбе в комментарии: роскошная версия того же сценария: цвет текста изменяется на желтый, если половина времени передала на красные 30 секунд, прежде чем приостановят.

enter image description here > enter image description here > enter image description here

Используйте его точно как 1a.

Сценарий

#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk, GObject, Pango
from threading import Thread
import subprocess
import time
import signal
import sys
import os

# --- set the color (index) below (1 is the first)
color = 1
# ---
textcolors = ["grey", "orange", "green", "blue", "white", "yellow", "red"]
# --- don't change anything below

txtcolor = textcolors[color-1]
al_cl1 = textcolors[5]; al_cl2 = textcolors[6]
countdown = int(sys.argv[1])
alarm1 = int(countdown/2)
alarm2 = 30

class CountDown(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self)
        maingrid = Gtk.Grid()
        self.add(maingrid)
        maingrid.set_border_width(40)
        # set initial text for the spash window
        self.label = Gtk.Label(convert_seconds(countdown))
        self.label.modify_font(Pango.FontDescription('Ubuntu 22'))
        self.label.modify_fg(Gtk.StateFlags.NORMAL, Gdk.color_parse(txtcolor))
        self.label.set_width_chars(10) 
        maingrid.attach(self.label, 0, 0, 1, 1)
        self.update = Thread(target=self.start_countdown, args=[countdown])
        # daemonize the thread
        self.update.setDaemon(True)
        self.update.start()

    def mod_color(self, color):
        self.label.modify_fg(Gtk.StateFlags.NORMAL, Gdk.color_parse(color))

    def start_countdown(self, countdown):
        idle1 = idletime()
        t1 = countdown
        t2 = countdown
        while True:
            time.sleep(1)
            idle2 = idletime()
            if idle2 < idle1:
                t2 = countdown
                if t1 <= alarm1:
                    # print("change textcolor default")
                    GObject.idle_add(self.mod_color, txtcolor,
                        priority=GObject.PRIORITY_DEFAULT)
            else:
                t2 -= 1
            if all([t2 <= alarm2, t1 > alarm2]):
                # print("change textcolor red")
                GObject.idle_add(self.mod_color, al_cl2,          
                    priority=GObject.PRIORITY_DEFAULT)
            elif all([t2 <= alarm1, t1 > alarm1]):
                # print("change textcolor yellow")
                GObject.idle_add(self.mod_color, al_cl1,          
                    priority=GObject.PRIORITY_DEFAULT) 
            if t2 <= 0:
                subprocess.Popen(["systemctl", "suspend"])
            GObject.idle_add(self.label.set_text, convert_seconds(t2),
                priority=GObject.PRIORITY_DEFAULT)
            idle1 = idle2
            t1 = t2

    def stop(self):
        Gtk.main_quit()

def get_screen():
    scr = [s.split("x") for s in subprocess.check_output([
        "xrandr"]).decode("utf-8").split() if "+0+0" in s][0]
    return int(scr[0]) - 300

def convert_seconds(sec):
    timedisplay = [
        str(int(sec/3600)),
        str(int((sec % 3600)/60)),
        str(int(sec % 60)),
        ]
    for i, n in enumerate(timedisplay):
        if len(n) == 1:
            timedisplay[i] = "0"+n
    return ":".join(timedisplay)

def idletime():
    return int(subprocess.check_output(
        "xprintidle"
        ).decode("utf-8").strip())/1000

def splashwindow():
    window = CountDown()
    window.set_decorated(False)
    window.set_resizable(False)
    window.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0,0,0,1))
    window.set_opacity(0.6)
    window.move(get_screen(), 80)
    window.set_keep_above(True)
    window.show_all()
    Gtk.main()

GObject.threads_init()
splashwindow()




2. Исходный ответ: версия, показывая время обратного отсчета после x время простоя

Установка ниже покажет, что обратный отсчет (в течение продолжительности произвольного момента времени) к следующему приостанавливает:

enter image description here

Окно имеет поверх остальных окон все другие окна, точно как пузыри уведомления.

Замены установки "нормальные" приостанавливают настройки, что означает Вас, должны отключить, приостанавливают от параметров настройки системы.

О решении

Команда для приостановки в сценарии:

 systemctl suspend

который не требует sudo. Последствие - то, что Вам будет нужно, по крайней мере, 15.04 использовать это решение.
Сценарий был записан и протестирован на Ubuntu (Единица) 15.10, но нет никакого определенного кода в нем, который должен быть конкретной Единицей. Я предполагаю, что это хорошо работает на всех версиях Ubuntu по умолчанию> 15.04

Как это работает

Для установки (подробная версия далее ниже) просто скопируйте эти три сценария, включенные в один и тот же каталог, точно названный, как обозначено. Для выполнения просто запустите основной скрипт (выполняющий время - проверка).

  • Если время простоя превышает определенный предел, окно обратного отсчета называют.
  • Если во время обратного отсчета компьютер становится не-неактивным (мышь - или событие клавиатуры), окно закрывается (его pid уничтожается).
  • Если таймер закончил свое количество вниз, он запускает простой скрипт для приостановки

Как установить

  1. Потребности сценария xprintidle:

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

    A. сохраните (точно) как win.py:

    #!/usr/bin/env python3
    import gi
    gi.require_version('Gtk', '3.0')
    from gi.repository import Gtk, Gdk, GObject, Pango
    from threading import Thread
    import subprocess
    import time
    import signal
    import sys
    import os
    
    # --- set the color (index) below (1 is the first)
    color = 1
    # ---
    textcolors = ["grey", "orange", "green", "blue", "white"]
    # --- don't change anything below
    txtcolor = textcolors[color-1]
    
    countdown = int(sys.argv[1])
    susp = os.path.dirname(os.path.realpath(__file__))+"/susp.sh"
    
    class CountDown(Gtk.Window):
    
        def __init__(self):
            Gtk.Window.__init__(self)
            maingrid = Gtk.Grid()
            self.add(maingrid)
            maingrid.set_border_width(40)
            # set initial text for the spash window
            self.label = Gtk.Label(convert_seconds(countdown))
            self.label.modify_font(Pango.FontDescription('Ubuntu 22'))
            self.label.set_width_chars(10) 
            maingrid.attach(self.label, 0, 0, 1, 1)
            self.update = Thread(target=self.start_countdown, args=[countdown])
            # daemonize the thread
            self.update.setDaemon(True)
            self.update.start()
    
        def start_countdown(self, countdown):
            t = countdown
            while t > 0:
                time.sleep(1)
                t -= 1
                GObject.idle_add(self.label.set_text, convert_seconds(t),
                    priority=GObject.PRIORITY_DEFAULT)
                print(t)
            subprocess.Popen(["/bin/bash", susp])
            self.stop()
    
        def stop(self):
            Gtk.main_quit()
    
    def get_screen():
        scr = [s.split("x") for s in subprocess.check_output([
            "xrandr"]).decode("utf-8").split() if "+0+0" in s][0]
        return int(scr[0]) - 300
    
    def convert_seconds(sec):
        timedisplay = [
            str(int(sec/3600)),
            str(int((sec % 3600)/60)),
            str(int(sec % 60)),
            ]
        for i, n in enumerate(timedisplay):
            if len(n) == 1:
                timedisplay[i] = "0"+n
        return ":".join(timedisplay)
    
    def splashwindow():
        window = CountDown()
        window.set_decorated(False)
        window.set_resizable(False)
        window.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0,0,0,1))
        window.modify_fg(Gtk.StateFlags.NORMAL, Gdk.color_parse(txtcolor))
        window.set_opacity(0.6)
        window.move(get_screen(), 80)
        window.set_keep_above(True)
        window.show_all()
        Gtk.main()
    
    GObject.threads_init()
    splashwindow()
    

    B. Сохраните точно как runner.py:

    #!/usr/bin/env python3
    import subprocess
    import time
    import os
    import sys
    
    window_mod = os.path.dirname(os.path.realpath(__file__))+"/win.py" 
    
    suspend = int(sys.argv[1])
    countdown = int(sys.argv[2])
    
    w = False
    while True:  
        time.sleep(1)
        idletime = int(subprocess.check_output(
            "xprintidle"
            ).decode("utf-8").strip())/1000
        if all([idletime > suspend-countdown, w == False]):
            subprocess.Popen(["python3", window_mod, str(countdown)])
            w = True
        elif all([idletime < suspend-countdown, w == True]):
            try:
                procdata = subprocess.check_output([
                    "pgrep", "-f", window_mod
                    ]).decode("utf-8").strip()
                procs = procdata.splitlines()
            except subprocess.CalledProcessError:
                pass
            else:
                for p in procs:
                    subprocess.Popen(["kill", p])
            w = False
    

    C. Сохраните (точно) как susp.sh:

    #!/bin/bash
    
    sleep 3
    systemctl suspend
    
  3. Сделайте все три исполняемых файла сценариев, и снова, удостоверьтесь, что они находятся в одном и том же каталоге.

  4. Вы практически сделаны.

    • Отключите свое "обычное", приостанавливают настройки
    • Тестовый прогон сценарий приостановить время (время простоя прежде приостанавливают, должен быть применен), и время простоя количества (в секундах) как аргументы, например:

      /path/to/runner.py 600 300
      

      для установки времени простоя на 10 минут счетчик запускается за 5 минут, до этого приостанавливают.

  5. Если все хорошо работает, добавьте его для запущения приложений: Тире> Приложения Запуска> Добавляет. Добавьте команду:

     /path/to/runner.py <idle_time> <countdown_time>
    

Примечания

  1. В главном разделе win.py, можно выбрать различные цвета для отображаемого текста:

    # --- set the color (index) below (1 is the first)
    color = 1
    # ---
    textcolors = ["grey", "orange", "green", "blue", "white"]
    
  2. Проигрывание со значениями в строках:

    maingrid.set_border_width(10)
    

    и

    return int(scr[0]) - 200 
    

    (от функции get_screen, где 200 расстояние левой стороны окна к правой стороне экрана), и

    window.move(get_screen(), 35)
    

    (где 35 расстояние между окном и вершиной экрана), можно легко изменить геометрию окна, например:

    enter image description here

Весело провести время :)

2
ответ дан 25 April 2016 в 23:25
  • 1
    @user2730030 Тогда голосуйте и примите, что он отмечает его, как решено. – d a i s y 20 September 2017 в 16:27

Можно установить программу, названную xprintidle, чтобы дать Вам время простоя компьютера, но необходимо было бы придумать своего рода сценарий для показа его на экране

, я бесполезен при записи сценариев, таким образом, это - вся справка, я могу придумать... надежду, которую это дает Вам место для запуска.

0
ответ дан 25 April 2016 в 23:25
  • 1
    Спасибо, это - корректный ответ в сервере Ubuntu 18.04, мой путь к файлу:/etc/mysql/mysql.conf.d/msqld.cnf – Eslam Badawy 4 November 2018 в 14:36

Другие вопросы по тегам:

Похожие вопросы: