这看似有点笼统,但实际上问题很简单。是否可以使用pubsub模块订阅主题的子集。
让我简要解释一下我想完成的工作。在wxpython项目中,我想根据不同事件更改状态栏中的文本。因此,我想拥有一个可以订阅一组主题的函数(一个侦听器)。在侦听器中,我将拥有if语句和几个elif语句,可以在其中检查主题名称。然后状态栏文本将相应更改。
是否可以这样做,或者首先是个坏主意。我应该如何处理这种情况。提前致谢
有两种方法。首先,也许是最简单的,您可能只有一个听众。当发布给侦听器时,您只需传递不同的信息即可。例如,从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/
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句