2024-05-17 12:33:41 发布
网友
这看起来有点笼统,但问题其实很简单。是否可以使用pubsub模块订阅主题的子集。在
让我简单地解释一下我想实现的目标。在wxpython项目中,我想根据不同的事件更改状态栏中的文本。所以我想要一个函数(一个监听器),可以订阅一组主题。在监听器中,我将有if语句和几个elif语句,其中将检查主题的名称。然后状态栏文本将相应地更改。在
有可能这样做吗,还是一开始就是个坏主意。我该如何处理这种情况呢。 提前谢谢
首先,这是个坏主意。你应该让pubsub帮你做这件事。每个主题一个听众。这样做没有成本,它隔离了代码,使维护更容易,职责分离。在
也就是说,侦听器可以监听基本主题:pub.subscribe('a.b', listener)将获得主题a.b、a.b.c、a.b.d、a.b.c.e等的消息。如pubsub文档中所述,您可以告诉pusub将topic对象作为消息的一部分,方法是使用一个默认值为pub.AUTO_TOPIC。但是,如果你使用这个策略,你最终会得到一长串if/elif/else列表,这可能不是正确的方法。在
pub.subscribe('a.b', listener)
pub.AUTO_TOPIC
也许如果你能提供更多关于你想要的主题层次结构的细节,以及你想要的那种if/else,我可以提供更多有用的反馈。在
有几种方法。也许你可以先有一个最简单的听众。当您向侦听器发布时,您只需向它传递不同的信息片段。例如,从类A中传递一个字符串。对于类B,可以传递一个不同的字符串,但传递给同一个侦听器。然后在监听器中,只需检查哪个字符串,如您所述。在
另一种方法是创建多个侦听器,它们都绑定到同一个函数或方法。然后你可以发布到不同的侦听器,它们将调用相同的东西。在
您应该使用最容易理解和调试的方法。在
下面是一个例子:
import wx from wx.lib.pubsub import pub ######################################################################## class OtherFrame(wx.Frame): """""" # def __init__(self): """Constructor""" wx.Frame.__init__(self, None, wx.ID_ANY, "Secondary Frame") panel = wx.Panel(self) msg = "Enter a Message to send to the main frame" instructions = wx.StaticText(panel, label=msg) self.msgTxt = wx.TextCtrl(panel, value="") sendBtn = wx.Button(panel, label="Send Msg") sendBtn.Bind(wx.EVT_BUTTON, self.onSendMsg) closeBtn = wx.Button(panel, label="Send and Close") closeBtn.Bind(wx.EVT_BUTTON, self.onSendAndClose) sizer = wx.BoxSizer(wx.VERTICAL) flags = wx.ALL|wx.CENTER sizer.Add(instructions, 0, flags, 5) sizer.Add(self.msgTxt, 0, flags, 5) sizer.Add(sendBtn, 0, flags, 5) sizer.Add(closeBtn, 0, flags, 5) panel.SetSizer(sizer) # def onSendMsg(self, event): """""" msg = "Another message!" pub.sendMessage("anotherListener", message=msg, listener="anotherListener") # def onSendAndClose(self, event): """ Send a message and close frame """ msg = self.msgTxt.GetValue() pub.sendMessage("panelListener", message=msg, listener="panelListener") self.Close() ######################################################################## class MyPanel(wx.Panel): """""" # def __init__(self, parent): """Constructor""" wx.Panel.__init__(self, parent) pub.subscribe(self.myListener, "panelListener") pub.subscribe(self.myListener, "anotherListener") btn = wx.Button(self, label="Open Frame") btn.Bind(wx.EVT_BUTTON, self.onOpenFrame) # def myListener(self, message, listener=None): """ Listener function """ if listener == "panelListener": print "panel listener has sent the following: ", print message elif listener == "anotherListener": print "another listener sent the following: ", print message # def onOpenFrame(self, event): """ Opens secondary frame """ frame = OtherFrame() frame.Show() ######################################################################## class MyFrame(wx.Frame): """""" # def __init__(self): """Constructor""" wx.Frame.__init__(self, None, title="New PubSub API Tutorial") panel = MyPanel(self) self.Show() # if __name__ == "__main__": app = wx.App(False) frame = MyFrame() app.MainLoop()
这是我的教程中的一个修改过的示例:http://www.blog.pythonlibrary.org/2013/09/05/wxpython-2-9-and-the-newer-pubsub-api-a-simple-tutorial/
另一种方法是调用发布订阅,对于同一订阅服务器功能,但具有不同的特定子主题。例如,假设您有一个电子邮件垃圾邮件过滤器,它将垃圾邮件分为20个不同的特定类别,这些类别可以分为五个组。此时您只需要处理这些类别中的两组。有一种方法:
def delete_spam_subscriber(header, message): delete_message(header, message) def junkmail_subscriber(header, message): move_to_junk(header, message) pub.subscribe(delete_spam_subscriber, 'root.spam.profanity') pub.subscribe(delete_spam_subscriber, 'root.spam.spyware') pub.subscribe(delete_spam_subscriber, 'root.spam.indirect') pub.subscribe(junkmail_subscriber, 'root.spam.unknown_sender') pub.subscribe(junkmail_subscriber, 'root.spam.forum_replys') pub.subscribe(junkmail_subscriber, 'root.spam.receive_but_limit')
当然,如果您不想通过分组主题来创建根.spam.deletables', 'root.spam.to\u junk_文件夹'
首先,这是个坏主意。你应该让pubsub帮你做这件事。每个主题一个听众。这样做没有成本,它隔离了代码,使维护更容易,职责分离。在
也就是说,侦听器可以监听基本主题:
pub.subscribe('a.b', listener)
将获得主题a.b、a.b.c、a.b.d、a.b.c.e等的消息。如pubsub文档中所述,您可以告诉pusub将topic对象作为消息的一部分,方法是使用一个默认值为pub.AUTO_TOPIC
。但是,如果你使用这个策略,你最终会得到一长串if/elif/else列表,这可能不是正确的方法。在也许如果你能提供更多关于你想要的主题层次结构的细节,以及你想要的那种if/else,我可以提供更多有用的反馈。在
有几种方法。也许你可以先有一个最简单的听众。当您向侦听器发布时,您只需向它传递不同的信息片段。例如,从类A中传递一个字符串。对于类B,可以传递一个不同的字符串,但传递给同一个侦听器。然后在监听器中,只需检查哪个字符串,如您所述。在
另一种方法是创建多个侦听器,它们都绑定到同一个函数或方法。然后你可以发布到不同的侦听器,它们将调用相同的东西。在
您应该使用最容易理解和调试的方法。在
下面是一个例子:
这是我的教程中的一个修改过的示例:http://www.blog.pythonlibrary.org/2013/09/05/wxpython-2-9-and-the-newer-pubsub-api-a-simple-tutorial/
另一种方法是调用发布订阅,对于同一订阅服务器功能,但具有不同的特定子主题。例如,假设您有一个电子邮件垃圾邮件过滤器,它将垃圾邮件分为20个不同的特定类别,这些类别可以分为五个组。此时您只需要处理这些类别中的两组。有一种方法:
当然,如果您不想通过分组主题来创建根.spam.deletables', 'root.spam.to\u junk_文件夹'
相关问题 更多 >
编程相关推荐