Комментарии 63
Классический AI на регэкспах и рерайтах :)
+6
arg1=string.join(sys.argv[1:],'\\ ') # получаем переменную из соседнего файла bash
Шта?
Автору советую сделать напоминание ;rm -rf /;1 через 15 минут и идти учить питон.
+2
Как бы Вы реализовали передачу текстовой фразы с пробелами из bash в python с учетом того, чтобы программа zenity поняла в атрибуте --entry-text пробелы?
-2
Наверное так же, как и во все остальные интерпретаторы, с\ экранированием\ пробелов как\ то\ так:
rico> cat test.sh
#!/bin/bash
echo $1
rico> ./test.sh all\ you\ need\ is\ love
all you need is love
Только разбор будет сложнее, но это уже к питону вопрос и к zenity.
гуев на сервере не держу, но думаю на все это поисковик ответит — не у Вас одного такая проблема.
rico> cat test.sh
#!/bin/bash
echo $1
rico> ./test.sh all\ you\ need\ is\ love
all you need is love
Только разбор будет сложнее, но это уже к питону вопрос и к zenity.
гуев на сервере не держу, но думаю на все это поисковик ответит — не у Вас одного такая проблема.
-1
Вообще аргумент можно взять в кавычки и тогда вся строка будет в
Модуль commands Deprecated since version 2.6:. getoutput если и использовать, то только в скриптах для себя. В идееале нужно вызывать subprocess.check_output() с командой в виде списка (если передавать строкой то будет тот же getoutput):
Да, это неудобно, зато аргументы будут переданы корректно и не нужно ничего экранировать. +Нету лишнего вызова bash'а, zenity будет вызван напрямую. +Наверняка есть библиотеки для таких вызовов по типу prepared statements в SQL.
PS: ещё заменчание по регэкспам:
sys.argv[1]
. Если оочень лень вводить кавычки и хочется, чтобы несколько аргументов сливались самим скриптом — делаем " ".join(sys.argv[1:])
. Но основная проблема — экранировать нужно не только пробел. Банальные примеры: ; ! () < >
. Так что часть аргументов все равно придется брать в кавычки. Это по поводу bash -> python.Модуль commands Deprecated since version 2.6:. getoutput если и использовать, то только в скриптах для себя. В идееале нужно вызывать subprocess.check_output() с командой в виде списка (если передавать строкой то будет тот же getoutput):
check_output(["zenity", "--entry", "--title=Напоминалка", "--text=Введите напоминание", "--entry-text=%s" % arg1, "--width=400"])
Да, это неудобно, зато аргументы будут переданы корректно и не нужно ничего экранировать. +Нету лишнего вызова bash'а, zenity будет вызван напрямую. +Наверняка есть библиотеки для таких вызовов по типу prepared statements в SQL.
PS: ещё заменчание по регэкспам:
[0-9][0-9][0-9][0-9]
никто не пишет, надо \d{4}
. (Только к строке-регэкспу добавить префикс r, чтобы слеш не утек).0
Для людей, которые работают в офисе с персональным компьютером — бухгалтеров, инженеров, секретарей
Представляю себе секретаршу-блондинку, которая сидит в Линуксе и строчит напоминалку на питоне :)))
+13
Скриншотов бы еще парочку небольших
+4
Вы молодец. Не для критики а для информации… В Ubuntu использовал Alarm из репозитария. Простая, работает надежно. И этап установки времени, как отдельное действие, мне нравится больше. Так более предсказуемо.
+2
НЛО прилетело и опубликовало эту надпись здесь
— Играет ли роль, где указывать время: в начале или в конце?
— Не, не играет роли. Когда я писал программу, я подумал об этом.
— Что будет, если опечататься?
— Если сделать опечатку (например, напишите «завтра пройти регистрацию», не указав времени), то появится ошибка «Попробуйте ещё раз..».
— Пробовали ли Вы найти готовую библиотеку, умеющую читать выражения даты/времени в «человеческом» формате?
— Не, не пробовал. В любом случае я перевожу «человеческий» формат на язык программы at.
— Планируется ли в будущем интеграция с календарями?
— Вообще-то не планировал, но идея интересная.
— Не, не играет роли. Когда я писал программу, я подумал об этом.
— Что будет, если опечататься?
— Если сделать опечатку (например, напишите «завтра пройти регистрацию», не указав времени), то появится ошибка «Попробуйте ещё раз..».
— Пробовали ли Вы найти готовую библиотеку, умеющую читать выражения даты/времени в «человеческом» формате?
— Не, не пробовал. В любом случае я перевожу «человеческий» формат на язык программы at.
— Планируется ли в будущем интеграция с календарями?
— Вообще-то не планировал, но идея интересная.
0
НЛО прилетело и опубликовало эту надпись здесь
Если написать «затра», то программа поймет это как «что делать», а не как «когда делать» в напоминании.
Например, если написать «затра в 11 распечатать файлы», а на часах 10:00, то в этот же день в 11:00 появится напоминание «затра распечатать файлы». Если на часах 12:00, то завтра в 11:00 появится напоминание «затра распечатать файлы».
Например, если написать «затра в 11 распечатать файлы», а на часах 10:00, то в этот же день в 11:00 появится напоминание «затра распечатать файлы». Если на часах 12:00, то завтра в 11:00 появится напоминание «затра распечатать файлы».
0
Вероятно, если указан день без указания времени, стоит не сообщать пользователю об ошибке, а использовать «время по умолчанию», которое возможно изменить в настройках.
0
НЛО прилетело и опубликовало эту надпись здесь
Советую автору man at.
+3
Программа At и заложена в основу представленной напоминалки.
Конечно же, без руководства at было бы сложно что-то сделать.
Конечно же, без руководства at было бы сложно что-то сделать.
+2
Тогда я совсем ничего не понимаю. Какая проблема была решена тогда? GUI для at?
+1
GUI для at и перевод простого понятного формата установки времени, типа «через 5 минут», «в 10», «завтра в 11-15», «в понедельник в 14-30» в формат at.
0
Да куда уж проще и понятнее-то?
«Через 5 минут»:
«Завтра в 11-15»:
И так далее.
You can also give times like now + count time-units, where the time-units can be minutes, hours, days, or weeks and you can tell at to run the job today by suffixing the time with today and to run the job tomorrow by suffixing the time with tomorrow.
«Через 5 минут»:
$ at now + 5 minutes
warning: commands will be executed using /bin/sh
at> /bin/ls
at> <EOT>
job 1 at Wed Oct 15 08:41:00 2014
«Завтра в 11-15»:
$ at 11:15 tomorrow
warning: commands will be executed using /bin/sh
at> /bin/ls
at> <EOT>
job 2 at Thu Oct 16 11:15:00 2014
И так далее.
0
Можно сделать так:
Можно даже так:
Но, мне кажется, проще сделать так:
К тому же программа позволяет отложить напоминание, что нельзя сделать в первых двух случаях.
1. Открыть терминал (например, Ctrl+Alt+T)
2. Ввести строку: at 11:15 tomorrow
3. Нажать Enter
4. Ввести строку: zenity --display=:0 --warning --text='сделать\ отчет'
5. Нажать Ctlr+D
Можно даже так:
1. Открыть терминал (например, Ctrl+Alt+T)
2. Ввести строку: echo DISPLAY=:0 zenity --warning --text='сделать\ отчет' | at 11:15 tomorrow
3. Нажать Enter
Но, мне кажется, проще сделать так:
1. Открыть напоминалку (например, Ctrl+Shift+X)
2. Ввести строку: завтра в 11-15 сделать отчет
3. Нажать Enter
К тому же программа позволяет отложить напоминание, что нельзя сделать в первых двух случаях.
+2
Что-то подобное я хотел написать больше 10 лет назад, когда жил в общаге.
Когда ставишь на плиту чайник/пельмени/макароны, идешь в комнату, а там компьютер и интернет…
Ну вы поняли.
Вспоминаешь, когда почувствуешь специфический запах или соседи пнут в дверь, проходя мимо
Правда, у меня была идея выбирать из предзаготовленных вариантов, типа рецептов, а не вводить каждый раз вручную
Зато я освоил команду shutdwn, которая бескомпромиссно отправляла меня спать в 00.00
:)
Когда ставишь на плиту чайник/пельмени/макароны, идешь в комнату, а там компьютер и интернет…
Ну вы поняли.
Вспоминаешь, когда почувствуешь специфический запах или соседи пнут в дверь, проходя мимо
Правда, у меня была идея выбирать из предзаготовленных вариантов, типа рецептов, а не вводить каждый раз вручную
Зато я освоил команду shutdwn, которая бескомпромиссно отправляла меня спать в 00.00
:)
0
извините не удержался
+4
Это, видимо, распространённая проблема :) Заранее настроенная на запуск по таймеру
shutdown -h now
спасла мне немало драгоценных часов сна на последних курсах университета.0
sh: 3: Syntax error: word unexpected (expecting "}")
Где-то закрался баг. :)
0
Всё на строках и len(). Мозг мой вытек, но если будет работать — хорошо, так как концепт симпатичный.
0
Если сделать хороший интерфейс с доступом из трея, сделать английскую версию, прикрутить создание событий в календаре, то получится хороший аналог одной популярной утилиты под мак, которая стоит почти 20 баксов (не даю ссылок и названия ибо реклама), и Open Source сообщество будет вам реально благодарно.
+3
Если делали для личных целей, т.е. под свою систему, можно было бы оформить в виде аплета на подобии cinnamon-spices.linuxmint.com/applets/view/68
— это удобней и наглядней для пользователя
PS
Вместо
пишите
без лишнего отрицания
— это удобней и наглядней для пользователя
PS
Вместо
if len(day) is not 0:
пишите
if len(day):
без лишнего отрицания
0
if day:
+5
На самом деле, это не вопрос лишнего отрицания. Автору очень повезло, что его код вообще работает.
Оператор
Пример:
Вообще, в булевом контексте только пустые контейнеры (и только пустые строки) вычисляются в False, поэтому можно писать просто
Оператор
is
не проверяет объекты на равенство, он проверяет объекты на идентичность, то есть «указывают ли 2 ссылки на один и тот же объект». Соответственно это не работало бы на целых числах, если бы не оптимизация, примененная в конкретной реализации (CPython): небольшие целые числа являются синглтонами (вопрос на SO). Равенство можно проверять только с помощью ==
, тогда как is
аподходит для сравнения с синглтонами: None
, True
и False
.Пример:
a = 1
b = 1
a is b # -> True
a = 1000
b = 1000
a is b # -> False
Вообще, в булевом контексте только пустые контейнеры (и только пустые строки) вычисляются в False, поэтому можно писать просто
if day:
+2
Задумка хорошая. Я бы еще после нажатие «ОК» запускал таймер минут на десять и делал уточнение, выполнена ли задача, а то бывает что могут опять отвлечь.
0
Поправьте это
com = commands.getstatusoutput('echo DISPLAY=:0 ~/remindme/task %s | %s' % (out,x))
на относительный путь. Достаточно разместить в другое место, как работать не будет.+1
НЛО прилетело и опубликовало эту надпись здесь
Невозможно отменить добавление задачи. Закрываешь окно или жмёшь Cancel — «попробуйте ещё раз». Только по Ctrl-C в терминале прибивается.
Непонятна причина «попробовать ещё раз». Неверный путь до задачи (указанный ploop), неверный формат даты, или что-то ещё?
Выкладывайте на Github, допилим.
Непонятна причина «попробовать ещё раз». Неверный путь до задачи (указанный ploop), неверный формат даты, или что-то ещё?
Выкладывайте на Github, допилим.
0
Кстати да, задумка очень интересная, но сыро.
0
Странно… Такой ошибки у меня не возникает. «Отмена» закрывает всё, независимо от введенного текста. При нажатии на кнопку «Отмена» переменная len(get) получает значение «0», и по логике программного кода переменная «loop» становится равной нулю. Цикл прерывается, программа закрывается.
Честно говоря, не знаю с чем это может быть связано… Возможно, проблема возникает из-за разных версий Python (у меня установлен 2.7.6).
Проект постараюсь выложить на Github сегодня после рабочего дня. Спасибо.
Честно говоря, не знаю с чем это может быть связано… Возможно, проблема возникает из-за разных версий Python (у меня установлен 2.7.6).
Проект постараюсь выложить на Github сегодня после рабочего дня. Спасибо.
0
Изменил условие «if len(get) is not 0» на «if get». Возможно, это решит проблему с «Отменой» на Вашем компьютере.
Напомню, что у меня проблемы такой не возникало…
Напомню, что у меня проблемы такой не возникало…
0
Так и быть, я влез в исходник и поковырял. Дело в совместном использовании zenity и commands.
В итоге в переменную get может прилететь:
Могу сам выложить на Github, оставив copyright и указав лицензию, какую выберете. Стоит хотя бы отформатировать код.
commands.getstatusoutput(cmd)
Execute the string cmd in a shell with os.popen() and return a 2-tuple (status, output). cmd is actually run as { cmd; } 2>&1, so that the returned output will contain output or error messages. A trailing newline is stripped from the output. The exit status for the command can be interpreted according to the rules for the C function wait().
В итоге в переменную get может прилететь:
- 'Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.'
- 'Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
Через 15 минут '
Могу сам выложить на Github, оставив copyright и указав лицензию, какую выберете. Стоит хотя бы отформатировать код.
+1
Выложил на Github
github.com/vsile/remindme.git
github.com/vsile/remindme.git
+2
Может быть, кому-то будет интересно: таск-трекер Remember The Milk поддерживает подобные форматы даты.
0
…
0
Для «простых напоминалок» и других задач лично мне жутко понравились kdialog и zenity.
Получается действительно уйма функционала — всего в пару строк.
Получается действительно уйма функционала — всего в пару строк.
0
Я просто оставлю это здесь legacy.python.org/dev/peps/pep-0008/
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Простая напоминалка на Linux