私は、wxpythonライブラリを使用してPythonでアプリケーションを構築しようとしています。Python - wxPythonでのStaticBoxSizerの破棄
(https://i.stack.imgur.com/bNB3q.png)のようにdinamicallyウィジェットを追加して削除したいので、何個のStaticBoxSizerを追加したり削除したりできますか?
ウィジェットを削除する方法が得られないうちにウィジェットを追加すると良い結果が得られました。私はStaticBoxSizerのすべてのウィジェットを破壊するのに成功していますが、コンテナのStaticBoxSizer自体を破棄することはできません。多くのブロックを追加してそのうちの1つを削除しようとすると、onRemoveMasterメソッドで何かが起き、Pythonがクラッシュします。
マイコード:
import wx
import wx.xrc
import wx.aui
class Example(wx.Frame):
def __init__(self, parent, title):
super(Example, self).__init__(parent, title=title,
size = wx.Size(726,624), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL)
self.InitUI()
self.Centre()
self.Show()
def InitUI(self):
self.number_of_added = 0
self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize)
#Setup MenuBar
self.m_menubar1 = wx.MenuBar(0)
self.m_menu1 = wx.Menu()
self.m_menubar1.Append(self.m_menu1, u"MyMenu")
self.m_menu2 = wx.Menu()
self.m_menubar1.Append(self.m_menu2, u"MyMenu")
self.SetMenuBar(self.m_menubar1)
#Setup Main Container
MainSizer = wx.BoxSizer(wx.VERTICAL)
self.ScrolledWindow = wx.ScrolledWindow(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.HSCROLL|wx.VSCROLL)
self.ScrolledWindow.SetScrollRate(1, 1)
MainVerticalSizer = wx.BoxSizer(wx.VERTICAL)
self.m_auinotebook1 = wx.aui.AuiNotebook(self.ScrolledWindow, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.aui.AUI_NB_DEFAULT_STYLE)
#Costruzione Master Sequence Tab
self.MasterSequenceTab = wx.ScrolledWindow(self.m_auinotebook1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.HSCROLL|wx.VSCROLL)
self.MasterSequenceTab.SetScrollRate(1, 1)
self.MasterVSizer = wx.BoxSizer(wx.VERTICAL)
MasterButtonSizer = wx.BoxSizer(wx.HORIZONTAL)
self.ButtonAdd = wx.Button(self.MasterSequenceTab, wx.ID_ANY, u"Add", wx.DefaultPosition, wx.DefaultSize, 0)
MasterButtonSizer.Add(self.ButtonAdd, 0, wx.ALL, 5)
self.ButtonAdd.Bind(wx.EVT_BUTTON, self.onAddMaster)
self.ButtonRemove = wx.Button(self.MasterSequenceTab, wx.ID_ANY, u"Remove", wx.DefaultPosition, wx.DefaultSize, 0)
MasterButtonSizer.Add(self.ButtonRemove, 0, wx.ALL, 5)
self.ButtonRemove.Bind(wx.EVT_BUTTON, self.onRemoveMaster)
self.MasterVSizer.Add(MasterButtonSizer, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, 5)
self.onAddMaster(self)
self.m_auinotebook1.AddPage(self.MasterSequenceTab, u"Master Sequence", False)
#Finalizzazione finestre
MainVerticalSizer.Add(self.m_auinotebook1, 1, wx.EXPAND, 5)
self.ScrolledWindow.SetSizer(MainVerticalSizer)
self.ScrolledWindow.Layout()
MainVerticalSizer.Fit(self.ScrolledWindow)
MainSizer.Add(self.ScrolledWindow, 1, wx.EXPAND |wx.ALL, 5)
self.SetSizer(MainSizer)
self.Layout()
self.Centre(wx.BOTH)
def onAddMaster(self, event):
self.number_of_added += 1
self.MastersbSizerAdded = wx.StaticBoxSizer(wx.StaticBox(self.MasterSequenceTab, 100+self.number_of_added, wx.EmptyString),wx.VERTICAL)
self.MasterCheckEnableAdded = wx.CheckBox(self.MastersbSizerAdded.GetStaticBox(), 200+self.number_of_added, u"Enable", wx.DefaultPosition, wx.DefaultSize, 0)
self.MasterCheckEnableAdded.SetValue(True)
self.MastersbSizerAdded.Add(self.MasterCheckEnableAdded, 0, wx.ALIGN_RIGHT|wx.ALL, 5)
MasterfgSizerAdded = wx.FlexGridSizer(0, 2, 0, 0)
MasterfgSizerAdded.SetFlexibleDirection(wx.BOTH)
MasterfgSizerAdded.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)
self.MasterTextNomeAdded = wx.StaticText(self.MastersbSizerAdded.GetStaticBox(), 1000+self.number_of_added, u"Nome", wx.DefaultPosition, wx.DefaultSize, 0)
self.MasterTextNomeAdded.Wrap(-1)
MasterfgSizerAdded.Add(self.MasterTextNomeAdded, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
self.MasterCtrlNomeAdded = wx.TextCtrl(self.MastersbSizerAdded.GetStaticBox(), 300+self.number_of_added, wx.EmptyString, wx.DefaultPosition, wx.Size(566,-1), 0)
MasterfgSizerAdded.Add(self.MasterCtrlNomeAdded, 0, wx.ALL, 5)
self.MasterTextDescrizioneAdded = wx.StaticText(self.MastersbSizerAdded.GetStaticBox(), 1100+self.number_of_added, u"Descrizione ", wx.DefaultPosition, wx.DefaultSize, 0)
self.MasterTextDescrizioneAdded.Wrap(-1)
MasterfgSizerAdded.Add(self.MasterTextDescrizioneAdded, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
self.MasterCtrlDescrizione1 = wx.TextCtrl(self.MastersbSizerAdded.GetStaticBox(), 400+self.number_of_added, wx.EmptyString, wx.DefaultPosition, wx.Size(566,-1), 0)
MasterfgSizerAdded.Add(self.MasterCtrlDescrizione1, 0, wx.ALL, 5)
self.MastersbSizerAdded.Add(MasterfgSizerAdded, 0, wx.ALL, 5)
MasterfgSizerAdded2 = wx.FlexGridSizer(3, 6, 0, 0)
MasterfgSizerAdded2.SetFlexibleDirection(wx.BOTH)
MasterfgSizerAdded2.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)
self.MasterTextSubjectAdded = wx.StaticText(self.MastersbSizerAdded.GetStaticBox(), 1200+self.number_of_added, u"Subject Area", wx.DefaultPosition, wx.DefaultSize, 0)
self.MasterTextSubjectAdded.Wrap(-1)
MasterfgSizerAdded2.Add(self.MasterTextSubjectAdded, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
self.MasterCtrlSubjectAdded = wx.TextCtrl(self.MastersbSizerAdded.GetStaticBox(), 500+self.number_of_added, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
MasterfgSizerAdded2.Add(self.MasterCtrlSubjectAdded, 0, wx.ALL, 5)
self.MasterTextAlimentanteAdded = wx.StaticText(self.MastersbSizerAdded.GetStaticBox(), 1300+self.number_of_added, u" Alimentante", wx.DefaultPosition, wx.DefaultSize, 0)
self.MasterTextAlimentanteAdded.Wrap(-1)
MasterfgSizerAdded2.Add(self.MasterTextAlimentanteAdded, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
self.MasterCtrlAlimentanteAdded = wx.TextCtrl(self.MastersbSizerAdded.GetStaticBox(), 600+self.number_of_added, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
MasterfgSizerAdded2.Add(self.MasterCtrlAlimentanteAdded, 0, wx.ALL, 5)
self.MasterTextGroupAdded = wx.StaticText(self.MastersbSizerAdded.GetStaticBox(), 1400+self.number_of_added, u" Num group", wx.DefaultPosition, wx.DefaultSize, 0)
self.MasterTextGroupAdded.Wrap(-1)
MasterfgSizerAdded2.Add(self.MasterTextGroupAdded, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
self.MasterCtrlGroupAdded = wx.TextCtrl(self.MastersbSizerAdded.GetStaticBox(), 700+self.number_of_added, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
MasterfgSizerAdded2.Add(self.MasterCtrlGroupAdded, 0, wx.ALL, 5)
self.MasterTextSchedulingAdded = wx.StaticText(self.MastersbSizerAdded.GetStaticBox(), 1500+self.number_of_added, u"Schedulazione", wx.DefaultPosition, wx.DefaultSize, 0)
self.MasterTextSchedulingAdded.Wrap(-1)
MasterfgSizerAdded2.Add(self.MasterTextSchedulingAdded, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
MasterCtrlSchedulingChoicesAdded = [ u"G", u"S", u"D", u"Q", u"M", u"BM", u"TM", u"SM", u"A" ]
self.MasterCtrlSchedulingAdded = wx.Choice(self.MastersbSizerAdded.GetStaticBox(), 800+self.number_of_added, wx.DefaultPosition, wx.DefaultSize, MasterCtrlSchedulingChoicesAdded, 0)
self.MasterCtrlSchedulingAdded.SetSelection(0)
MasterfgSizerAdded2.Add(self.MasterCtrlSchedulingAdded, 0, wx.ALL, 5)
self.MasterTextValidoAdded = wx.StaticText(self.MastersbSizerAdded.GetStaticBox(), 1600+self.number_of_added, u" Record valido", wx.DefaultPosition, wx.DefaultSize, 0)
self.MasterTextValidoAdded.Wrap(-1)
MasterfgSizerAdded2.Add(self.MasterTextValidoAdded, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
MasterCtrlValido1Choices = [ u"Y", u"N" ]
self.MasterCtrlValidoAdded = wx.Choice(self.MastersbSizerAdded.GetStaticBox(), 900+self.number_of_added, wx.DefaultPosition, wx.DefaultSize, MasterCtrlValido1Choices, 0)
self.MasterCtrlValidoAdded.SetSelection(0)
MasterfgSizerAdded2.Add(self.MasterCtrlValidoAdded, 0, wx.ALL, 5)
self.MastersbSizerAdded.Add(MasterfgSizerAdded2, 0, wx.ALL, 5)
self.MasterVSizer.Add(self.MastersbSizerAdded, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5)
self.MasterSequenceTab.SetSizer(self.MasterVSizer)
self.MasterSequenceTab.Layout()
self.MasterVSizer.Fit(self.MasterSequenceTab)
def onRemoveMaster(self, event):
for i in range(16,0,-1):
button = 100*i+self.number_of_added
widget = self.MasterSequenceTab.FindWindowById(button)
widget.Destroy()
self.MasterSequenceTab.SetSizer(self.MasterVSizer)
self.MasterSequenceTab.Layout()
self.MasterVSizer.Fit(self.MasterSequenceTab)
self.number_of_added -= 1
if __name__ == '__main__':
app = wx.App()
Example(None, title='Test')
app.MainLoop()
すてきな提案。私はStaticBoxSizerを含むパネルを追加しました。 – qwe