2010-01-13 35 views
5

是否有可能在Python GTK +中創建新的信號?Python GTK +:創建自定義信號?

我想要一個骨架代碼示例。

+0

感謝您的接受,它打破了我由於某種奇怪的原因,一直持有10k的障礙。 – 2010-01-13 15:52:43

+0

@Aiden:我的榮幸:對不起,我今天沒有留言(早日獲得配額)。 – jldupont 2010-01-13 16:00:13

+0

不用擔心,把我推到'k'領域是非常感謝! – 2010-01-13 16:06:36

回答

6

的摘錄:

創建自己的信號

繼承GObject的是定義 定製的信號時,你可能想 使用其他的事情。您可以創建自己的 可以發射的信號,以便您的課程的用戶可以連接 他們的 。

當一個信號發出時,將會執行一組關閉 。關閉 是回調 概念的抽象。關閉是回調 本身(一個函數指針),用戶 數據(它將是 回調的最後一個參數)和 清理問題的另一個函數,本文中討論的不會是 。

對於這篇文章的目的,你不 真正需要知道的回調和閉合,從而 兩個術語將被使用之間的區別 。但是建議 這不是完全正確的 。

正如我們前面所說的,當一個信號是 發出時,一組關閉將會執行 。其中一個 對於此類 的所有實例都是同一個 ,因此其名稱爲:類關閉, ,其他的是自定義用戶 回調。請注意,並非所有的 信號都需要關閉 ,因爲它是可選的。

從,http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm,希望有所幫助。還有就是網站和here,一個片段上的示例代碼:

import pygtk 
pygtk.require('2.0') 
import gobject 

class Car(gobject.GObject): 
    __gproperties__ = { 
     'fuel' : (gobject.TYPE_FLOAT, 'fuel of the car', 
        'amount of fuel that remains in the tank', 
        0, 60, 50, gobject.PARAM_READWRITE) 
     } 

    __gsignals__ = { 
     'engine-started' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, 
          (gobject.TYPE_FLOAT,)) 
     } 

    def __init__(self): 
     gobject.GObject.__init__(self) 
     self.fuel = 50 

    def do_get_property(self, property): 
     if property.name == 'fuel': 
      return self.fuel 
     else: 
      raise AttributeError, 'unknown property %s' % property.name 

    def do_set_property(self, property, value): 
     if property.name == 'fuel': 
      self.fuel = value 
     else: 
      raise AttributeError, 'unknown property %s' % property.name 

    def do_engine_started(self, remaining_fuel): 
     print '***** Beginning of class closure *****' 
     print 'The engine is ready and we still have %f of fuel' % self.fuel 
     print '***** End of class closure *****' 

    def start(self): 
     self.emit('engine-started', self.get_property('fuel')) 

gobject.type_register(Car) 
+0

嗯......我在Google搜索會話期間怎麼會錯過這個...謝謝! – jldupont 2010-01-13 15:45:57

+0

不用擔心;)... – 2010-01-13 15:46:23

+0

我的全部樂趣是:你的10K屏障。回頭見。 – jldupont 2010-01-13 15:59:21

3

的答案是正確的,當然,但使用libraries是不容易的煩惱:

import gobject 

from pygtkhelpers.utils import gsignal 

class Car(gobject.GObject): 

    gsignal('engine-started', float) # yeah baby