2010-10-19 6 views
0

Comment puis-je déclencher et écouter les événements en python?Comment puis-je déclencher et écouter des événements en python?

je besoin d'un exemple pratique ..

grâce

Mise à jour

#add Isosurface button 
def addIso(): 
    #trigger event 

self.addButton = tk.Button(self.leftFrame, text="Add", command=addIso) #.grid(column=3, row=1) 
self.addButton.pack(in_=self.leftFrame, side="right", pady=2) 
+2

Quel genre d'événements? S'il vous plaît soyez plus précis. – kanaka

+0

@kanaka J'ai besoin d'invoquer une fonction quand un bouton est appelé. Mais cette fonction est dans une autre classe, donc j'ai besoin d'écouter cet événement. – aneuryzm

+0

Habituellement, la boîte à outils de l'interface utilisateur que vous utilisez déterminera la réponse. Quelle boîte à outils UI utilisez-vous et pouvez-vous poster un code explicatif snipit peut-être. – kanaka

Répondre

0

Il y a une fonction de liaison pour les objets tkinter qui prend deux paramètres: la première est une chaîne représentant le nom de l'événement que vous voulez écouter (probablement "" dans ce cas), et le second est une méthode qui prend l'événement déclencheur en paramètre.

Exemple:

def addButton_click(event): 
    print 'button clicked' 
self.addButton.bind("<Button-1>", addButton_click) 

Je crois que cela fonctionne toujours, même si elle est utilisée d'une autre classe:

class X: 
    def addButton_click(self, event): 
     print 'button clicked' 
... 
inst = X() 
self.addButton.bind("<Button-1>", inst.addButton_click) 
+0

@ user470379 Vous devez donc avoir une instance (inst) de la classe (X) ayant la fonction que vous voulez appeler (addButton_click) dans la classe de boutons. Ensuite, je n'ai pas vraiment besoin de lier, parce que je peux invoquer directement une telle fonction droite? La raison pour laquelle je demandais un événement est que je ne veux pas de relations entre les deux classes. – aneuryzm

+0

Je n'ai pas d'expérience avec python, j'ai besoin de quelque chose de similaire à ce que vous avez dans Actionscript par exemple (addEventListener, méthodes triggerEvent) – aneuryzm

+0

Cela dépend du type de fonction de l'autre classe. Si c'est une méthode d'instance, alors oui, vous avez besoin d'une instance. Si c'est une méthode de classe ou une méthode statique, alors vous pouvez juste utiliser la classe elle-même sans une instance (dans ce cas ce serait X.addButton_click). Je ne suis pas sûr de ce que vous voulez en ce qui concerne les relations - il me semble que vous essayez d'appeler des fonctions dans une autre classe sans utiliser cette autre classe. – user470379

0

Quelque chose comme ceci:

#add Isosurface button 
def addIso(event): 
    #trigger event 

self.addButton = tk.Button(self.leftFrame, text="Add") #.grid(column=3, row=1) 
self.addButton.pack(in_=self.leftFrame, side="right", pady=2) 
self.addButton.bind("<Button-1>", addIso) 

De: http://www.bembry.org/technology/python/notes/tkinter_3.php

+0

@kanaka Merci, et si la fonction addIso est dans une autre classe? – aneuryzm

+0

Vous aurez probablement besoin d'une fonction intermédiaire qui appelle la méthode d'instance, sinon le paramètre d'événement sera transmis comme self (l'objet d'instance). C'est à dire. addIso dans l'exemple appelle myinst.addIso (event). – kanaka

+0

Ou vous pourriez utiliser une fonction anonyme: bind (..., lambda e: myinst.addIso (e)) – kanaka

0

Si vous utilisez IronPython avec Windows Presentation Foundation (WPF), vous pouvez trouver pyevent.py dans le répertoire Ironpython \ Tutorial. Cela vous permet d'écrire des choses comme:

import clr 
clr.AddReferenceByPartialName("PresentationFramework") 
import System 
import pyevent 

class myclass(object): 
    def __init__(self): 
     self._PropertyChanged, self._OnPropertyChanged = pyevent.make_event() 
     self.initialize() 

    def add_PropertyChanged(self, handler): 
     self._PropertyChanged += handler 

    def remove_PropertyChanged(self, handler): 
     self._PropertyChanged -= handler 

    def raiseAPropertyChangedEvent(self, name): 
     self._OnPropertyChanged(self, System.ComponentModel.PropertyChangedEventArgs(name)) 
+0

Je n'utilise pas IronPython .. juste Python préinstallé sur Mac OSX – aneuryzm

1

Sur la base de vos commentaires à quelques-unes des réponses existantes, je pense que ce que vous voulez est quelque chose comme le module pubsub. Dans le contexte de Tkinter, les événements ont un seul objectif: un événement se déclenche sur un widget et un gestionnaire gère l'événement (bien que plusieurs gestionnaires puissent être impliqués). Ce que cela ressemble à ce que vous voulez est plus d'un modèle de diffusion - votre widget dit "hé, l'utilisateur a fait quelque chose" et tout autre module peut enregistrer l'intérêt et recevoir des notifications sans savoir précisément quel widget ou événement de bas niveau a causé se passer. Je l'utilise dans une application qui prend en charge les plugins.

Les plugins peuvent dire quelque chose comme "appeler ma méthode 'ouverte' quand l'utilisateur ouvre un nouveau fichier". Ils ne se soucient pas comment l'utilisateur le fait (c'est-à-dire s'il était dans le menu Fichier, ou une icône de la barre d'outils ou un raccourci), seulement que c'est arrivé.

Dans ce cas, vous devez configurer votre bouton pour appeler une méthode spécifique, généralement dans le même module que celui qui crée le bouton. Cette méthode utiliserait alors le module pubsub pour publier une sorte d'événement générique que les autres modules écoutent et répondent.

Questions connexes