razum2um 19.06.2009 20:51
Есть вопрос! — [Решено] python, kde4 - всплывающее сообщение в трее
Пишу для себя немного на python&pyqt4;До сих пор чтобы получить таковое "фирменное" уведомление делал
1 |
os.system('kdialog \
|
Конечно жуть, но средствами pyqt не выходит...
1 |
tray_icon = QSystemTrayIcon()
|
Обидно,что уведомление всплывает в верхнем левом углу экрана, не зависимо от отго, где трей...
Подскажите, куда посмотреть?
Код-то прост...
http://dumpz.org/9910/
'icon.png' имеется и отображается нормально.
Дело именно в уведомлении...
http://dumpz.org/9910/
'icon.png' имеется и отображается нормально.
Дело именно в уведомлении...
Бегло пробежался по докам:
Суть в том, что каждая система имеет свои настройки и "правила" для таких сообщений, и иногда они могут даже не быть отображены вообще. Так что использовать таки тултипы как единственный способ информирования не советуют.
А как выглядит тултип в левом верхнем углу? Обычный прямоугольник похожий на уведомление от Yakuake, например? Или стандартный такой Tooltip, но хвостик от облачка уходит туда, где трея нет?
И еще - вы пробовали в других DE? Тот же GNOME или что попроще (openbox, icewm)
Note that display of messages are dependent on the system configuration and user preferences, and that messages may not appear at all. Hence, it should not be relied upon as the sole means for providing critical information.
Суть в том, что каждая система имеет свои настройки и "правила" для таких сообщений, и иногда они могут даже не быть отображены вообще. Так что использовать таки тултипы как единственный способ информирования не советуют.
А как выглядит тултип в левом верхнем углу? Обычный прямоугольник похожий на уведомление от Yakuake, например? Или стандартный такой Tooltip, но хвостик от облачка уходит туда, где трея нет?
И еще - вы пробовали в других DE? Тот же GNOME или что попроще (openbox, icewm)
Ну, я это для себя. А я всю жизнь линуксовую в kde провел.
http://img37.imageshack.us/img37/3735/sn62.png
(Похоже на уведомление kopete в kde3)
http://img37.imageshack.us/img37/3735/sn62.png
(Похоже на уведомление kopete в kde3)
Как я понял, вы хотите использовать информационную область kde4, тогда надо:
import sys
import dbus
dbus.SessionBus().get_object("org.kde.knotify", "/Notify").event("warning", "kde", <>, "Текст для всплывания", <0,0,0,0>, <>, 0,
dbus_interface="org.kde.KNotify")
Ага! Вот и Вы туда же.
Вываливается так:
http://dumpz.org/9911/
Я ж тоже гуглил)
http://mvidner.blogspot.com/2008/06/knotify-client.html
Там в комментах у одного человека такая же ошибка...
От него цитата:
PS
Вы может не знаете, я этот вопрос задал на linuxforum - там за МЕСЯЦ - НИ ОДНОГО ответа.
Я задал его на русском форуме qt - там посоветовали смотреть qutim.
Но это не в тему. Там C++ и кроме того не то, что я подразумеваю под "официальным" notification
Вываливается так:
http://dumpz.org/9911/
Я ж тоже гуглил)
http://mvidner.blogspot.com/2008/06/knotify-client.html
Там в комментах у одного человека такая же ошибка...
От него цитата:
'qdbus org.kde.knotify /Notify' doesn't show an event method, but if I run dbus-monitor I can watch konsole generating messages with the event method (the watch-for-activity thing)
PS
Вы может не знаете, я этот вопрос задал на linuxforum - там за МЕСЯЦ - НИ ОДНОГО ответа.
Я задал его на русском форуме qt - там посоветовали смотреть qutim.
Но это не в тему. Там C++ и кроме того не то, что я подразумеваю под "официальным" notification
посмотрите код плазмоида gmail (http://kde-look.org/content/show.php/gmail-plasmoid?content=101229)
при наличии новой почты он показывает уведомление рядом со своим значком на панели (у меня панель слева)
хотя может я не про те уведомления говорю..
при наличии новой почты он показывает уведомление рядом со своим значком на панели (у меня панель слева)
хотя может я не про те уведомления говорю..
Мда. Плазмоиз хороший и аккуратный, только, действительно, не то.
Вы сделайте в kde4
И поймете о чем я.
Вы сделайте в kde4
kdialog --title "This is a passive popup" --passivepopup "It disappears in about 3 seconds" 3
И поймете о чем я.
мм, вот как оно у меня выглядит:
http://img230.imageshack.us/img230/8341/screen8.png
да, версия kde 4.3, там что-то про уведомления в чейнджлоге говорили
http://img230.imageshack.us/img230/8341/screen8.png
да, версия kde 4.3, там что-то про уведомления в чейнджлоге говорили
Попробовал в KDE4 - действительно, всегда в левом верхнем углу. В Antico и OpenBox - где-то посреди экрана.. В любом случае - на лицо баг. Может он уже известен..?
Не думаю.
И вот почему: я в С++ не рублю, но когда читал qutim, там как-то хитро устанавливалась Qpoint. Логично. Только как ее вычислять и как подвязать к python я и не знаю...
И вот почему: я в С++ не рублю, но когда читал qutim, там как-то хитро устанавливалась Qpoint. Логично. Только как ее вычислять и как подвязать к python я и не знаю...
ну кутешный код на питоне аналогично будет выглядеть
так что особой проблемы то нет
так что особой проблемы то нет
Нашел-таки решение и протестировал!
Здесь человек имел точно такую же траблу и вот в чем секрет ее решения:
You shouldn't call showMessage() until after the event loop has started. One solution is to use a single shot timer with a timeout of 0.
Не следует вызывать showMessage() до начала основного цикла. Решением может стать использование одноразового таймера с задержкой в 0
Далее человек приводит работающий код:
import sys
from PyQt4.QtCore import SIGNAL
from PyQt4.QtGui import QApplication
from PyQt4.QtGui import QIcon
from PyQt4.QtGui import QMenu
from PyQt4.QtGui import QAction
from PyQt4.QtGui import QSystemTrayIcon
from PyQt4.QtCore import QString
from PyQt4.QtCore import SLOT
from PyQt4.QtCore import QTimer
if __name__ == "__main__":
app = QApplication(sys.argv)
plik = QString("/usr/share/icons/crystalsvg/16x16/apps/wine.png")
menu = QMenu()
quitAction = menu.addAction('Quit')
sicon = QIcon(plik)
tray = QSystemTrayIcon(sicon)
tray.setContextMenu(menu)
tray.show() quitAction.connect(quitAction, SIGNAL("triggered()"), app, SLOT("quit()"))
tray.setToolTip("Ale czad!")
def show_message():
tray.showMessage("Title of the message", "Body of the message")
QTimer.singleShot(100, show_message) sys.exit(app.exec_())
Однако, надо сказать что у меня этот вариант не сработал.. Я гуглил дальше и тупо читал код других проектов где используется этот же принцип с таймером. И нашел-таки, уведомлялка обновлений KDE4, если не ошибаюсь, использовала тот же принцип, но задержку они сделали не 100 мс, а 1000. Я попробовал с 2000 мс (2 сек.) чтобы наверняка и все вышло.
В том же коде КДЕшной уведомлялки был коментарий, что задержка нужна, чтобы "успеть переместить" вновь создаваемое всплывающее "облачко" на то место, где у пользователя трей. То есть фактически, питон просто не успевал перенести его..
Большое спасибо.
Точно. Я это тоже видел, тоже попробовал с 100 и забил на таймер...
Экспериментально у меня с 506 работает. С 505 уже нет :)
Кстати, думаю, эта задержка - один из наиболее практически ценных "бенчмарков".
Тут оптимизация кода и играет наибольшую роль.
Жаль нет возможности поставить что-нить кроме Gentoo и протестить...
Точно. Я это тоже видел, тоже попробовал с 100 и забил на таймер...
Экспериментально у меня с 506 работает. С 505 уже нет :)
Кстати, думаю, эта задержка - один из наиболее практически ценных "бенчмарков".
Тут оптимизация кода и играет наибольшую роль.
Жаль нет возможности поставить что-нить кроме Gentoo и протестить...
Нет, бенчмарк из него никакой - тут еще играет роль то, в каком углу у вас трей, какого разрешения экран, насколько "тяжелая" система запущена и насколько быстрая машинка. Да что там говорить - я нашел "границу" в ОпенБоксе с запущенной плазмой, оказалось 545/546. Запустил это дело из Yakuake в полноценном KDE - уже не успевает. А затем запустил то же самое через Alt+F2 - сработало!
Так что тут меряться не получится..
Так что тут меряться не получится..
По вопросу - а не могли бы вы запостить куда-нибудь полный текст файлов? я на питоне никогда не программировал, но если выложите элементарный пример с иконкой (от первой до последней строчки файла), то я бы при первой возможности поковырялся.
Не то чтобы времени у меня много, но выкроить попробовал бы =)