Иногда я оставляю свой компьютер без работы, когда мне нужно куда-то идти, но я оставляю его с людьми, которым я абсолютно доверяю, и я скоро вернусь, поэтому нет реальной необходимости приостанавливать работу (например, если это семья, и я просто выскакиваю на Ло, который находится на небольшом расстоянии от моего места, и вы знаете, не всегда удобно останавливать мою машину, когда это так), или могут быть другие причины, почему я хочу этого, например, знать, должен ли я бежать к своему машина, чтобы шевелить мышью перед тем, как она засыпает, или если я могу пойти к компьютеру медленнее.
В любом случае, чтобы добраться до сути, я хотел бы иметь возможность запустить обратный отсчет (предпочтительно в прозрачном окне (бит сквозного просмотра не является обязательным) поверх всего в верхнем правом углу. моего экрана чуть ниже верхней панели), который покажет мне обратный отсчет до следующего времени ожидания.
Это может либо сбрасывать таймер каждый раз, когда я взаимодействую с машиной, либо каким-либо образом напрямую взаимодействовать с системой приостановки, чтобы сообщить, когда наступает следующая приостановка (потому что я предполагаю, что есть какой-то обратный отсчет). Как можно добиться чего-то подобного (конечно, я бы не хотел, чтобы окно всегда было открыто, но вместо этого я мог запускать команду в любое время, которое будет запускать окно, или это может быть даже обратный отсчет в окне терминала). что я просто переместился бы или был бы автоматически расположен в верхнем правом углу, если бит GUI вообще проблематичен)?
Я использую Ubuntu GNOME 15.10 с GNOME 3.18, но решение также должно работать с Ubuntu GNOME 16.04 с GNOME 3.20, как я планирую в ближайшее время.
В исходном ответе, далее ниже, окно обратного отсчета появилось после произвольного времени простоя. Пере - чтение Вашего вопроса, Вы могли бы хотеть это постоянно. Постоянная версия ниже (который более прост), исходный ответ далее вниз.
Решением является фоновый сценарий, показывая полу - прозрачное окно обратного отсчета. Окно ведет себя как уведомление: это всегда видимо на вершине, но (конечно) можно работать в других окнах, как обычно:
Начальное время является временем простоя, прежде чем приостановят, должен быть активирован. Время сбрасывается на мыши - события клавиатуры.
Поскольку изображение показывает, сценарий идет отличающийся пред - параметры цвета набора (см. далее ниже).
Потребности сценария xprintidle
:
sudo apt-get install xprintidle
countdown.py
Выполните его со временем простоя как аргумент:
python3 /path/to/countdown.py <idle_time>
например.
python3 /path/to/countdown.py 300
для ввода приостанавливают после 5 минут.
Если все хорошо работает, добавьте его для запущения приложений: Тире> Приложения Запуска> Добавляет. Добавьте команду:
/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()
Цвет текста может быть изменен, как объяснено в самой нижней части второй версии ответа.
> >
Используйте его точно как 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()
Установка ниже покажет, что обратный отсчет (в течение продолжительности произвольного момента времени) к следующему приостанавливает:
Окно имеет поверх остальных окон все другие окна, точно как пузыри уведомления.
Замены установки "нормальные" приостанавливают настройки, что означает Вас, должны отключить, приостанавливают от параметров настройки системы.
Команда для приостановки в сценарии:
systemctl suspend
который не требует sudo
. Последствие - то, что Вам будет нужно, по крайней мере, 15.04
использовать это решение.
Сценарий был записан и протестирован на Ubuntu
(Единица) 15.10
, но нет никакого определенного кода в нем, который должен быть конкретной Единицей. Я предполагаю, что это хорошо работает на всех версиях Ubuntu по умолчанию> 15.04
Для установки (подробная версия далее ниже) просто скопируйте эти три сценария, включенные в один и тот же каталог, точно названный, как обозначено. Для выполнения просто запустите основной скрипт (выполняющий время - проверка).
Потребности сценария xprintidle
:
sudo apt-get install xprintidle
Скопируйте эти три сценария ниже в отдельные пустые файлы, сохраните в одном и том же каталоге, точно названном, как обозначено:
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
Сделайте все три исполняемых файла сценариев, и снова, удостоверьтесь, что они находятся в одном и том же каталоге.
Вы практически сделаны.
Тестовый прогон сценарий приостановить время (время простоя прежде приостанавливают, должен быть применен), и время простоя количества (в секундах) как аргументы, например:
/path/to/runner.py 600 300
для установки времени простоя на 10 минут счетчик запускается за 5 минут, до этого приостанавливают.
Если все хорошо работает, добавьте его для запущения приложений: Тире> Приложения Запуска> Добавляет. Добавьте команду:
/path/to/runner.py <idle_time> <countdown_time>
В главном разделе win.py
, можно выбрать различные цвета для отображаемого текста:
# --- set the color (index) below (1 is the first)
color = 1
# ---
textcolors = ["grey", "orange", "green", "blue", "white"]
Проигрывание со значениями в строках:
maingrid.set_border_width(10)
и
return int(scr[0]) - 200
(от функции get_screen
, где 200 расстояние левой стороны окна к правой стороне экрана), и
window.move(get_screen(), 35)
(где 35 расстояние между окном и вершиной экрана), можно легко изменить геометрию окна, например:
Весело провести время :)
Можно установить программу, названную xprintidle
, чтобы дать Вам время простоя компьютера, но необходимо было бы придумать своего рода сценарий для показа его на экране
, я бесполезен при записи сценариев, таким образом, это - вся справка, я могу придумать... надежду, которую это дает Вам место для запуска.