Python XRC按钮不可单击

Python XRC按钮不可单击,python,button,clickable,wxwidgets,xrc,Python,Button,Clickable,Wxwidgets,Xrc,我正在开发一个python应用程序,遇到了一个障碍。我的目标是拥有一个包含许多控件的主框架,以及一个将从运行时指定的xrc文件加载的面板。本质上,当用户单击按钮时,我希望从xrc文件填充一个面板,xrc文件是根据单击哪个按钮来选择的 我正在用XRCed定义UI,以下是我到目前为止所做的。这似乎会将子面板控件加载到框架中,但它们不可单击,并且它们不会像我希望的那样出现在DynamicPanel中。非常感谢你的帮助 编辑 我已经修改了我的主代码,现在控件显示在框架中的位置,但是按钮仍然无法单击。谁能

我正在开发一个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()
导入wx
将wx.xrc作为xrc导入
从未命名的xrc导入xrcFRAME1
类XrcFrameSubClass(xrcFRAME1):
""""""
#----------------------------------------------------------------------
定义初始化(自):
xrcFRAME1.\uuuuu init\uuuuuuuuu(自,父=无)
self.Bind(wx.EVT_按钮、self.OnButton_1、self.button1)
self.Bind(wx.EVT_按钮、self.OnButton_2、self.button2)
self.Bind(wx.EVT_按钮、self.OnButton_清除、self.BUTTON_清除)
self.Show()
def ON按钮_清除(自身、事件):
self.ClearSubPanel()
def清除面板(自身):
尝试:
self.SubPanel.Destroy()
self.Fit()
self.Layout()
除:
通过
def ON按钮_1(自身,事件):
self.ClearSubPanel()
子面板_xrc=“”
WX垂直
你母亲是一个
仓鼠
黑骑士
'''
#PanelCoord=self.DynamicPanel.GetPosition()
TopSizer=self.TopPanel.GetSizer()
res=xrc.EmptyXmlResource()
res.LoadFromString(子面板)
self.SubPanel=res.LoadPanel(self,“SubPanel”)
#注意:sizer.Insert()方法的第一个参数是插入新项的索引
顶置器.插入(1,自子面板,1,wx.展开| wx.ALL,5)
self.Fit()
self.Layout()
##还不确定如何动态绑定事件
#self.SubButton1=xrc.XRCCTRL(self.SubPanel,“SubButton1”)
#self.SubButton2=xrc.XRCCTRL(self.SubPanel,“SubButton2”)
def ON按钮2(自身,事件):
self.ClearSubPanel()
子面板_xrc=“”
水平方向
你父亲有股
接骨木
灌木林
'''
TopSizer=self.TopPanel.GetSizer()
res=xrc.EmptyXmlResource()
res.LoadFromString(子面板)
self.SubPanel=res.LoadPanel(self,“SubPanel”)
#注意:sizer.Insert()方法的第一个参数是插入新项的索引
顶置器.插入(1,自子面板,1,wx.展开| wx.ALL,5)
self.Layout()
self.Fit()
#self.SubButton1=xrc.XRCCTRL(self.SubPanel,“SubButton1”)
#self.SubButton2=xrc.XRCCTRL(self.SubPanel,“SubButton2”)
如果名称=“\uuuuu main\uuuuuuuu”:
app=wx.app(假)
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>

这是标题
WX垂直
WX垂直
加载子XRC 1
1.
wxGROW
加载子XRC 2
1.
wxGROW
清楚的
40,20
1.
wxEXPAND
100,200
水平方向
按钮3
按钮4
wxALIGN_中心

您是否尝试过使用wxFormBuilder生成XRC?它可以让您为整个应用程序生成一个XRC文件,包括您的Boxsizer、子面板等。我发现这比手动布局或使用多个XRC文件要容易得多。我没有,但我会研究一下。不过,我仍然有一个问题,那就是如何在面板中显示哪个xrc块。试试这个问题:我无法找到wx控件不处于活动状态的具体问题的解决方案(可单击--随便什么)因此,我最终采用了另一种解决方案,包括预先定义一组面板并隐藏/显示它们。这不是一个优雅的解决方案,但它似乎有效。