0

私はpythonアプリに取り組んでおり、問題が発生しました。私の目標は、多数のコントロールを含むメイン フレームと、実行時に指定された xrc ファイルから読み込まれるパネルを持つことです。基本的に、ユーザーがボタンをクリックすると、xrc ファイルからパネルが作成されます。xrc ファイルは、クリックされたボタンに基づいて選択されます。

私は XRCed で UI を定義しています。これにより、サブパネル コントロールがフレームに読み込まれるように見えますが、クリック可能ではなく、DynamicPanel 内に期待どおりに表示されません。どうぞよろしくお願いいたします。

編集

メイン コードを修正したところ、コントロールがフレーム内の場所に表示されるようになりましたが、ボタンはまだクリックできません。誰でも理由を教えてもらえますか?

Python コード:

import wx
import wx.xrc as xrc


from UNTITLED_xrc import xrcFRAME1

class XrcFrameSubClass(xrcFRAME1):
    """"""
    #----------------------------------------------------------------------
    def __init__(self):
        xrcFRAME1.__init__(self, parent = None)

        self.Bind(wx.EVT_BUTTON, self.OnButton_1, self.button1)
        self.Bind(wx.EVT_BUTTON, self.OnButton_2, self.button2)
        self.Bind(wx.EVT_BUTTON, self.OnButton_Clear, self.Button_Clear)

        self.Show()


    def OnButton_Clear(self, event):
        self.ClearSubPanel()

    def ClearSubPanel(self):
        try:
            self.SubPanel.Destroy()
            self.Fit()
            self.Layout()
        except:
            pass


    def OnButton_1(self, event):
        self.ClearSubPanel()

        SubPanel_xrc = '''<?xml version="1.0" ?><resource>
  <object class="wxPanel" name="SubPanel">
    <object class="wxBoxSizer">
      <orient>wxVERTICAL</orient>
      <object class="sizeritem">
        <object class="wxStaticText">
          <label>Your Mother was a</label>
        </object>
      </object>
      <object class="sizeritem">
        <object class="wxButton" name="SubButton1">
          <label>Hamster</label>
        </object>
      </object>
      <object class="sizeritem">
        <object class="wxButton" name="SubButton2">
          <label>Black Knight</label>
        </object>
      </object>
    </object>
  </object>
</resource>'''


        #PanelCoord = self.DynamicPanel.GetPosition()

        TopSizer = self.TopPanel.GetSizer()

        res = xrc.EmptyXmlResource() #Here it is
        res.LoadFromString(SubPanel_xrc)

        self.SubPanel = res.LoadPanel(self, "SubPanel")
        #Note: the first argument of the sizer.Insert() method is the index at which to insert the new item
        TopSizer.Insert(1,self.SubPanel,1, wx.EXPAND|wx.ALL, 5)

        self.Fit()
        self.Layout()

#        #Not sure how to do the event binding dynamically yet
#        self.SubButton1 = xrc.XRCCTRL(self.SubPanel, "SubButton1")
#        self.SubButton2 = xrc.XRCCTRL(self.SubPanel, "SubButton2")


    def OnButton_2(self, event):
        self.ClearSubPanel()

        SubPanel_xrc = '''<?xml version="1.0" ?>
<resource>
  <object class="wxPanel" name="SubPanel">
    <object class="wxBoxSizer">
      <orient>wxHORIZONTAL</orient>
      <object class="sizeritem">
        <object class="wxStaticText">
          <label>Your father smelt of</label>
        </object>
      </object>
      <object class="sizeritem">
        <object class="wxButton" name="SubButton1">
          <label>Elderberries</label>
        </object>
      </object>
      <object class="sizeritem">
        <object class="wxButton" name="SubButton2">
          <label>Shrubberies</label>
        </object>
      </object>
    </object>
  </object>
</resource>'''


        TopSizer = self.TopPanel.GetSizer()

        res = xrc.EmptyXmlResource() #Here it is
        res.LoadFromString(SubPanel_xrc)

        self.SubPanel = res.LoadPanel(self, "SubPanel")

        #Note: the first argument of the sizer.Insert() method is the index at which to insert the new item
        TopSizer.Insert(1,self.SubPanel,1, wx.EXPAND|wx.ALL, 5)

        self.Layout()
        self.Fit()

#        self.SubButton1 = xrc.XRCCTRL(self.SubPanel, "SubButton1")
#        self.SubButton2 = xrc.XRCCTRL(self.SubPanel, "SubButton2")

if __name__ == "__main__":
    app = wx.App(False)
    frame = XrcFrameSubClass()
    app.MainLoop()

メインフレーム:

<?xml version="1.0" encoding="cp1252"?>
<resource>
  <object class="wxFrame" name="FRAME1">
    <title>This is the title</title>
    <object class="wxPanel" name="TopPanel">
      <object class="wxBoxSizer">
        <orient>wxVERTICAL</orient>
        <object class="sizeritem">
          <object class="wxBoxSizer">
            <orient>wxVERTICAL</orient>
            <object class="sizeritem">
              <object class="wxButton" name="button1">
                <label>Load SubXRC 1</label>
              </object>
              <option>1</option>
              <flag>wxGROW</flag>
            </object>
            <object class="sizeritem">
              <object class="wxButton" name="button2">
                <label>Load SubXRC 2</label>
              </object>
              <option>1</option>
              <flag>wxGROW</flag>
            </object>
            <object class="sizeritem">
              <object class="wxButton" name="Button_Clear">
                <label>Clear</label>
              </object>
            </object>
            <object class="spacer">
              <size>40,20</size>
            </object>
          </object>
        </object>
        <object class="sizeritem">
          <object class="wxPanel" name="DynamicPanel"/>
          <option>1</option>
          <flag>wxEXPAND</flag>
          <minsize>100,200</minsize>
        </object>
        <object class="sizeritem">
          <object class="wxBoxSizer">
            <orient>wxHORIZONTAL</orient>
            <object class="sizeritem">
              <object class="wxButton" name="button3">
                <label>button3</label>
              </object>
            </object>
            <object class="sizeritem">
              <object class="wxButton" name="button4">
                <label>button4</label>
              </object>
            </object>
          </object>
          <flag>wxALIGN_CENTRE</flag>
        </object>
      </object>
    </object>
  </object>
</resource>
4

0 に答える 0