У меня есть один кадр, где один TextCtrl и кнопка. Я хотел бы ввести значение в этот TextCTrl и отобразить его в другом фрейме TextCTrl, а также использовать это значение для вычислений в этом новом фрейме. Любая идея будет оценена.
Передача значений между wx.frame wxpython
Ответы (2)
Не уверен, что именно ты хочешь и как ты хочешь. если у вас есть два кадра в одном приложении, почему вы не можете просто скопировать из одного 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()
вы можете использовать pubsub lib для этого, но вам нужно будет знать о закрытии одного из фреймов, чтобы данные могли быть отправлены в другой фрейм. То, как это работает, основано на шаблоне «публикация-подписка», где вы используете подписчика (EVT_listerner), который получает сообщение, которое издатель может отправить ему. Событие будет прослушиваться до тех пор, пока кадр издателя не будет уничтожен, после чего вы сможете получить собранные данные.
Вот пример того, как его использовать:
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