私は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>