#gtk #pygtk #appindicator
#gtk #pygtk #appindicator
Вопрос:
Я только что обнаружил tomate:https://gitorious.org/tomate очень простая программа, которая помогает выполнять задачи, когда вы работаете на компьютере.
Но tomate использует gtk.status_icon вместо appindicator, поэтому я хотел бы это исправить.
Тем не менее, я хотел бы сохранить то же поведение с appindicator. Это очень просто в использовании, и я не хочу создавать меню и усложнять его использование.
Простое поведение заключается в том, что при нажатии на значок вы запускаете счетчик времени, а при повторном нажатии вы его останавливаете.
Итак, вам не нужно меню.
Возможно ли использовать appindicator без меню или с базовым меню, которое просто получает щелчок и не содержит никаких элементов?
Спасибо за помощь.
Комментарии:
1. Вот как я это сделал, используя меню: gitorious.org /~natim/tomate/natim-tomate это неплохо, но не так просто, как другой.
Ответ №1:
На самом деле меню — это то, что делает appindicator таким разным.
Итак, по сути, я просто создал меню и изменил способ обновления меню и значка.
diff -r 13c201b1030a tomate.py
--- a/tomate.py Fri May 13 19:48:31 2011 0200
b/tomate.py Wed May 18 09:26:43 2011 0200
@@ -1,53 1,79 @@
#!/usr/bin/env python
from __future__ import division
import pygtk
pygtk.require('2.0')
import gtk
import os
from time import time
from math import floor
gtk.gdk.threads_init()
import gobject
import appindicator
#Parameters
MIN_WORK_TIME = 60 * 10 # min work time in seconds
class Pomodoro:
def __init__(self):
- self.icon=gtk.status_icon_new_from_file(self.icon_directory() "idle.png")
- self.icon.set_tooltip("Idle")
self.ind = appindicator.Indicator("tomate","tomate",
appindicator.CATEGORY_APPLICATION_STATUS)
self.ind.set_status (appindicator.STATUS_ACTIVE)
self.ind.set_icon(self.icon_directory() "idle.png")
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
self.menu = gtk.Menu()
# Tooltip item
self.item = gtk.MenuItem('Idle')
self.item.connect("activate", self.icon_click, None)
self.item.show()
self.menu.append(self.item)
# A separator
separator = gtk.SeparatorMenuItem()
separator.show()
self.menu.append(separator)
# A quit item
item = gtk.MenuItem('Quit')
item.connect("activate", gtk.main_quit, None)
item.show()
self.menu.append(item)
self.menu.show_all()
self.ind.set_menu(self.menu)
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(self.icon_directory() state ".png")
self.ind.set_icon(self.icon_directory() state ".png")
if state == "idle":
delta = time() - self.start_working_time
if old_state == "ok":
- self.icon.set_tooltip("Good! Worked for %s." %
self.item.get_child().set_text("Good! Worked for %s." %
self.format_time(delta))
elif old_state == "working":
- self.icon.set_tooltip("Not good: worked for only %s." %
self.item.get_child().set_text("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.item.get_child().set_text("Working for %s..." % self.format_time(delta))
self.state=state
def icon_directory(self):
return os.path.dirname(os.path.realpath(__file__)) os.path.sep
- def icon_click(self,dummy):
def icon_click(self, *args):
delta = time() - self.start_working_time
if self.state == "idle":
self.set_state("working")
@@ -59,7 85,7 @@
if self.state == "idle":
pass
else:
- self.icon.set_tooltip("Working for %s..." % self.format_time(delta))
self.item.get_child().set_text("Working for %s..." % self.format_time(delta))
if self.state == "working":
if delta > MIN_WORK_TIME:
self.set_state("ok")