我有一个框架,其中一个TextCtrl和一个按钮。我想在TextCTrl中输入一个值,并在另一个框架TextCTrl中显示,并在该新帧中使用该值进行计算。任何想法都将不胜感激。
答案 0 :(得分:1)
不确定您想要什么以及您想要什么。如果你在同一个应用程序中有两个帧,为什么你不能只从一个textctrl复制到另一个文本更改事件,或者当用户按下某个按钮时,例如尝试这个例子,如果你键入一个帧也会显示另一个在wx.EVT_TEXT
import wx
app = wx.PySimpleApp()
frame1 = wx.Frame(None, title="Type Here...", pos=(0,0), size=(300,300))
frame2 = wx.Frame(None, title="...to get value here", pos=(310,0), size=(300,300))
tc1 = wx.TextCtrl(frame1)
tc2 = wx.TextCtrl(frame2)
def textChange(event):
tc2.SetValue(tc1.GetValue())
tc1.Bind(wx.EVT_TEXT, textChange)
app.SetTopWindow(frame1)
frame1.Show()
frame2.Show()
app.MainLoop()
答案 1 :(得分:1)
您可以使用pubsub lib这样做,但是您必须知道关闭其中一个框架,以便将数据发送到另一个框架。因此,这种工作方式是基于“发布-订阅”模式的,其中您使用一个订阅者(EVT_listerner),该订阅者会接收到pusblisher能够发送给它的消息。该事件将一直监听,直到发布者框架被破坏为止,您可以在此之后收集数据。
以下是使用方法的示例:
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="")
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(closeBtn, 0, flags, 5)
panel.SetSizer(sizer)
#----------------------------------------------------------------------
def onSendAndClose(self, event):
"""
Send a message and close frame
"""
msg = self.msgTxt.GetValue()
pub.sendMessage("panelListener", message=msg)
pub.sendMessage("panelListener", message="test2", arg2="2nd argument!")
self.Close()
########################################################################
class MyPanel(wx.Panel):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent)
pub.subscribe(self.myListener, "panelListener")
btn = wx.Button(self, label="Open Frame")
btn.Bind(wx.EVT_BUTTON, self.onOpenFrame)
#----------------------------------------------------------------------
def myListener(self, message, arg2=None):
"""
Listener function
"""
print "Received the following message: " + message
if arg2:
print "Received another arguments: " + str(arg2)
#----------------------------------------------------------------------
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()
有关发布-订阅模式的更多信息,请查看以下内容: \ https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern
有关该库的更多信息:https://wxpython.org/Phoenix/docs/html/wx.lib.pubsub.pub.html#wx.lib.pubsub.pub.getDefaultPublisher