如何在python中触发和监听事件?

时间:2010-10-19 15:23:33

标签: python tkinter

如何在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 个答案:

答案 0 :(得分:1)

根据您对某些现有答案的评论,我认为您想要的是pubsub模块。在Tkinter的上下文中,事件是单一目的 - 一个事件在一个窗口小部件上触发,一些处理程序处理事件(尽管可能涉及多个处理程序)。

你想要的更多是一个广播模型 - 你的小部件说“嘿,用户做了一些事情”,任何其他模块都可以注册兴趣并获得通知,而不知道具体是什么小部件或低级事件导致发生。

我在支持插件的应用中使用它。插件可以说“当用户打开新文件时调用我的'打开'方法”。他们不关心用户是如何做到的(即:它是来自“文件”菜单,还是工具栏图标或快捷方式),只是它发生了。

在这种情况下,您可以将按钮配置为调用特定方法,通常在创建按钮的同一模块中。然后,该方法将使用pubsub模块发布一些其他模块侦听和响应的通用事件。

答案 1 :(得分:0)

TKinter对象有一个绑定函数,它有两个参数:第一个是表示你想要监听的事件名称的字符串(在这种情况下可能是“”),第二个是触发的方法event作为参数。

示例:

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)

答案 2 :(得分:0)

这样的事情:

#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

答案 3 :(得分:0)

如果您在Windows Presentation Foundation(WPF)中使用IronPython,则可以在Ironpython \ Tutorial目录中找到pyevent.py。这可以让你写下这样的东西:

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