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

1

Я пишу небольшое приложение pyGTK, которое отображает и обновляет значок области уведомлений. Код выглядит следующим образом:

#!/usr/bin/env python2
from __future__ import division

import pygtk
pygtk.require('2.0')
import gtk
from time import time
from math import floor
gtk.gdk.threads_init()
import gobject

#Parameters
MIN_WORK_TIME = 60 * 10 # min work time in seconds

class Pomodoro:
    def __init__(self):
        self.icon=gtk.status_icon_new_from_file("idle.svg")
        self.icon.set_tooltip("Idle")
        self.state = "idle"
        self.tick_interval=10 #number of seconds between each poll
        self.icon.connect('activate',self.icon_click)
        self.icon.set_visible(True)
        self.start_working_time = 0
    def format_time(self,seconds):
        minutes = floor(seconds / 60)
        if minutes > 1:
            return "%d minutes" % minutes
        else:
            return "%d minute" % minutes
    def set_state(self,state):
        old_state=self.state
        self.icon.set_from_file(state+".svg")
        if state == "idle":
            delta = time() - self.start_working_time
            if old_state == "ok":
                self.icon.set_tooltip("Good! Worked for %s." % 
                        self.format_time(delta))
            elif old_state == "working":
                self.icon.set_tooltip("Not good: worked for only %s." % 
                        self.format_time(delta))
        else:
            if state == "working":
                self.start_working_time = time()
            delta = time() - self.start_working_time
            self.icon.set_tooltip("Working for %s..." % self.format_time(delta))
        self.state=state
    def icon_click(self,dummy):
        delta = time() - self.start_working_time
        if self.state == "idle":
            self.set_state("working")
        else:
            self.set_state("idle")
    def update(self):
        """This method is called everytime a tick interval occurs"""
        delta = time() - self.start_working_time
        if self.state == "idle":
            pass
        else:
            self.icon.set_tooltip("Working for %s..." % self.format_time(delta))
            if self.state == "working":
                if delta > MIN_WORK_TIME:
                    self.set_state("ok")
        source_id = gobject.timeout_add(self.tick_interval*1000, self.update)
    def main(self):
        # All PyGTK applications must have a gtk.main(). Control ends here
        # and waits for an event to occur (like a key press or mouse event).
        source_id = gobject.timeout_add(self.tick_interval, self.update)
        gtk.main()

# If the program is run directly or passed as an argument to the python
# interpreter then create a Pomodoro instance and show it
if __name__ == "__main__":
    app = Pomodoro()
    app.main()

Он отлично работает, когда я запускаю его с терминала, но значок не отображается, когда я запускаю его в начале моего графического сеанса (я использую KDE, если это имеет значение).

Любая идея, что может произойти? Это проблема с моим кодом, или это ошибка в KDE?

  • 1
    Я пытался конвертировать мои SVG-файлы в PNG, и, хотя он рендерится быстрее, проблема все еще остается.
  • 1
    я запустил это на gnome 2.22.3, и это сработало (после того, как я добавил некоторые иконки из других мест в качестве standin), так что мне интересно, действительно ли в вашей установке kde запущен системный xdg?
Показать ещё 1 комментарий
Теги:
notifications
gtk
pygtk

2 ответа

2
Лучший ответ

Вы пытаетесь запустить приложение из подкаталога вашего каталога /home/username? Мне интересно, нужно ли включать полный путь к файлам изображений в вашем коде.

  • 0
    Ах, может быть, мы кое-что здесь. Я проверю это и сообщу.
  • 0
    +1, я считаю, что это проблема, он должен сделать что-то вроде: curdir = os.path.split(__file__)[0] а затем image_path = os.path.join(curdir, "idle.svg") а затем он может сделать gtk.status_icon_new_from_file(image_path)
Показать ещё 2 комментария
1

Возможно, "в начале [вашего] графического сеанса" область уведомлений не завершила инициализацию. Что произойдет, если ваша программа спит в течение нескольких секунд перед отображением значка? (Я не говорю, что это было бы лучшим решением, но оно было бы быстрым и легким и могло бы выявить источник проблемы)

  • 0
    Хорошая идея, я попробую это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню