0

このコードを実行すると、Panel Oneのコンボボックスからデフォルト値が取得されますが、Panel 2で値を変更した後、Panel1ボタンから呼び出された値はPanel2での値の変更を反映しません。

    import wx

class PanelOne(wx.Panel):
    def __init__(self, parent, id):
        wx.Panel.__init__(self, parent, id)

        self.button1 = wx.Button(self, -1, label="Panel 1 Test",
            pos=wx.Point(100, 100))
        self.button1.Bind(wx.EVT_BUTTON, self.button1Click, self.button1)


    def button1Click(self,event):
        p2=PanelTwo(self, 0)
        print "Panel 1: %s" % p2.C1
        print "Panel 1: %s" % p2.C2


class PanelTwo(wx.Panel):
    def __init__(self, parent, id):
        wx.Panel.__init__(self, parent, id)

        # Default Declarations
        self.C1 = List1[0]
        self.C2 = List2[-1]

        self.combo1 = wx.ComboBox(self, -1, value=List1[0], pos=wx.Point(100, 30),
        size=wx.Size(100, 150), choices=List1, style = wx.CB_READONLY)
        self.Bind(wx.EVT_COMBOBOX, self.EvtCmb1, self.combo1)

        self.combo2 = wx.ComboBox(self, -1, value=List2[-1], pos=wx.Point(300, 30),
            size=wx.Size(100, 150), choices=List2, style = wx.CB_READONLY)
        self.Bind(wx.EVT_COMBOBOX, self.EvtCmb2, self.combo2)    

        self.button1 = wx.Button(self, -1, label="Panel 2 Test",
            pos=wx.Point(100, 100))
        self.button1.Bind(wx.EVT_BUTTON, self.button1Click, self.button1)


    def button1Click(self,event):
        print "Panel 2: %s" % self.C1
        print "Panel 2: %s" % self.C2

    def EvtCmb1(self, event):
        combo1 = (event.GetString())
        self.C1 = combo1

    def EvtCmb2(self, event):
        combo2 = (event.GetString())
        self.C2 = combo2



class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="Testing 123", size = (500, 400) )

        p = wx.Panel(self)
        nb = wx.Notebook(p)

        panel1 = PanelOne(nb,-1)
        panel2 = PanelTwo(nb,-1)

        nb.AddPage(panel1, "Page One")
        nb.AddPage(panel2, "Page Two")

        sizer = wx.BoxSizer()
        sizer.Add(nb, 1, wx.EXPAND)
        p.SetSizer(sizer)


#Combo1
List1 = ['Apple', 'Banana']
#Combo2
List2 = ["1", "2", "3", "4"]


app = wx.App(redirect=False)
frame = MainFrame()
frame.Show(True)
app.MainLoop()
4

1 に答える 1

1

コードがわかりにくいと思いますが、問題が見つかったと思います。あなたの機能を考えてみましょうPanelOne.button1Click()

def button1Click(self,event):
    p2=PanelTwo(self, 0)
    print "Panel 1: %s" % p2.C1
    print "Panel 1: %s" % p2.C2

PanelTwo毎回の新しいインスタンスを作成しています。つまり、常にデフォルト値があります。車のメーカーやモデルなどのクラスを考えてみてください。私はトヨタカムリを持つことができます、そしてあなたはトヨタカムリを持つことができます。それらは同じタイプ(クラス)の車ですが、別々の車(異なるインスタンス)です。がカムリに加えた変更は、まったく異なるオブジェクトであるため、明らかにあなたの変更には影響しません。したがって、このアナロジーに従って、PanelOne.button1Click()が呼び出されるたびに、新しいCamryを購入します(新しいインスタンスを作成します)。既存のものは取得しません。その新しい車は、他の所有者が自分の車をどのように変更するかに関係なく、すべてのデフォルトオプションで工場から新鮮になります。

つまり、基本的に、panel1インスタンスとpanel2インスタンスはまったく通信していないためpanel1、の状態については何も知ることができませんpanel2。これを解決する方法はいくつかあります。最も簡単な方法は、の引数panel2として渡すことです。このような:initpanel1

class PanelOne(wx.Panel):
    def __init__(self, parent, id, p2):
        wx.Panel.__init__(self, parent, id)

        self.p2 = p2 #store panel2 so we can check it later

        #do the rest of your setup

   def button1Click(self,event):
        print "Panel 1: %s" % self.p2.C1
        print "Panel 1: %s" % self.p2.C2

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="Testing 123", size = (500, 400) )

        panel2 = PanelTwo(nb,-1)
        panel1 = PanelOne(nb,-1, panel2) #panel1 needs to be able to read panel2's settings

        #do the rest of your setup

これはまだ素晴らしい解決策ではありません。一般に、PubSubを使用して、依存関係を発生させずにクラス間で情報を渡すことを試みます(つまり、元のコードであっても、PanelOne存在しないことに注意PanelTwoしてください)が、それは目的にとって非常に複雑だと思います。

于 2012-07-06T03:42:25.627 に答える