Как я могу запустить и прослушать события в Python? - PullRequest
0 голосов
/ 19 октября 2010

Как я могу вызвать и прослушать события в Python?

Мне нужен практический пример ..

спасибо

Обновление

#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)

Ответы [ 4 ]

1 голос
/ 22 октября 2010

Исходя из ваших комментариев к некоторым из существующих ответов, я думаю, что вам нужно что-то вроде модуля pubsub .В контексте Tkinter события имеют одно назначение - одно событие запускается в одном виджете, а какой-то обработчик обрабатывает событие (хотя может быть задействовано несколько обработчиков).

То, что вы хотите, - это большемодель широковещания - ваш виджет говорит «эй, пользователь что-то сделал», и любой другой модуль может регистрировать интерес и получать уведомления, не зная точно, какой виджет или событие низкого уровня вызвало это.

Я использую это в приложении, которое поддерживает плагины.Плагины могут сказать что-то вроде «вызвать мой метод open, когда пользователь открывает новый файл».Они не заботятся о том, как пользователь делает это (то есть: было ли это из меню «Файл», или из значка панели инструментов, или из-за ярлыка), только из-за того, что это произошло.

В этом случае вы должны настроить свою кнопкувызывать определенный метод, обычно в том же модуле, который создает кнопку.Затем этот метод будет использовать модуль pubsub для публикации какого-либо общего вида событий, которые другие модули слушают и отвечают на них.

0 голосов
/ 19 октября 2010

Примерно так:

#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)

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

0 голосов
/ 19 октября 2010

Если вы используете IronPython с Windows Presentation Foundation (WPF), вы можете найти pyevent.py в каталоге Ironpython \ Tutorial. Это позволяет вам писать что-то вроде:

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 голосов
/ 19 октября 2010

Существует функция связывания для объектов TKinter, которая принимает два параметра: первый - это строка, представляющая имя события, которое вы хотите прослушать (в данном случае, вероятно, ""), а второй - метод, который принимает запуск событие как параметр.

Пример:

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

Я считаю, что это все равно будет работать, даже если используется из другого класса:

class X:
    def addButton_click(self, event):
        print 'button clicked'
...
inst = X()
self.addButton.bind("<Button-1>", inst.addButton_click)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...