Передача значений между wx.frame wxpython

У меня есть один кадр, где один TextCtrl и кнопка. Я хотел бы ввести значение в этот TextCTrl и отобразить его в другом фрейме TextCTrl, а также использовать это значение для вычислений в этом новом фрейме. Любая идея будет оценена.


person user247705    schedule 11.01.2010    source источник


Ответы (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()
person Anurag Uniyal    schedule 11.01.2010
comment
Анурагу, спасибо за ответ. У меня есть рамка с txtCTrl и кнопкой. Когда пользователь вводит число и нажимает кнопку «ОК», он открывает другой фрейм, который также имеет TxtCtrl и две кнопки. TxtCrtl из второго фрейма будет отображать число, введенное из первого фрейма, и мне также нужно сохранить это время для расчет во втором кадре. Я могу захватить и отобразить его, но я не могу использовать его для расчета. - person user247705; 17.01.2010

вы можете использовать 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

person Graphs Rodriguez    schedule 16.11.2018