2010-01-13 7 views
5

Ist es möglich, neue Signale in Python GTK + zu erstellen?Python GTK +: benutzerdefinierte Signale erstellen?

Ich möchte bitte ein Skelett Code Beispiel.

+0

Vielen Dank für das akzeptieren, brach es meine 10k Barriere, die den ganzen Abend aus irgendeinem seltsamen Grund gehalten hat. –

+0

@Aiden: mein Vergnügen: Entschuldigung, ich habe heute keine Upvotes mehr (Quote früh erreicht). – jldupont

+0

Keine Sorge, drängt mich in 'k' Gebiet ist genug danke! –

Antwort

6

Ein Auszug:

Erstellen Ihrer eigenen Signale

Die andere Sache, die Sie wahrscheinlich zu verwenden möchten, wenn Subklassen GObject benutzerdefinierte Signale definieren ist. Sie können Ihre eigenen Signale erstellen, die ausgegeben werden können, so dass sich Benutzer Ihrer Klasse mit verbinden können.

Wenn ein Signal ausgegeben wird, wird eine Reihe von Schließungen ausgeführt. Eine Schließung ist eine Abstraktion des Rückrufs Konzept. Eine Schließung ist der Rückruf selbst (ein Funktionszeiger), der Benutzer Daten (es wird der letzte Parameter zu der Rückruf sein) und eine andere Funktion für Bereinigungsprobleme, die nicht in diesem Dokument diskutiert werden.

Im Interesse dieses Artikels Sie nicht wirklich den Unterschied zwischen einem Rückruf wissen müssen, und einem Verschluss so beiden Begriffe verwendet. Aber sei empfohlen, dass dies nicht vollständig korrekt ist.

Wie bereits gesagt, wenn ein Signal ausgegeben wird, wird eine Reihe von Schließungen ausgeführt. Einer von ihnen ist der gleiche für alle Instanzen dieser Klasse und daher der Name: die Klasse Schließung, und die anderen sind benutzerdefinierte Benutzer Rückrufe. Beachten Sie, dass nicht alle Signale eine Klassenschließung haben müssen, weil es optional ist.

Von, http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm, hoffe das hilft. Es gibt Beispielcode auf der Website und here, ein Ausschnitt:

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

hmmm ... wie habe ich das bei meiner googling Session vermisst ... danke! – jldupont

+0

Keine Sorgen;) ... –

+0

Das Vergnügen ist all meine Re: Ihre 10K Barriere. Bis demnächst. – jldupont

3

Die Antworten sind richtig natürlich, aber libraries mit weniger anfällig für Schmerzen:

import gobject 

from pygtkhelpers.utils import gsignal 

class Car(gobject.GObject): 

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