Неправильная раскладка при переносе кода диалога на python 3 и phoenix
Я портирую свой старый код Python 2.7 на 3.6 с wxpython phoenix и сейчас борюсь с wxdialog, где мне не удается получить правильный макет. Все вигдеты появляются в верхнем левом углу окна. Кто-нибудь может помочь?
Я работаю с Python 3.6.4, wxpython 4.0.1 Msw (Феникс). Файл XRC был создан с помощью wxFormBuilder 3.5.
Это то, что я ожидаю (показано wxFormBuilder):
И вот что я получаю:
заранее спасибо
С уважением
Изменить Я попытался получить Sizer, содержащий кнопку self.m_button_ok.GetContainingSizer()
, Этот метод возвращает None! Означает ли это, что нет ценных Ценеров?
Вот мой код:
import wx
import wx.xrc
class CTestDialog( wx.Dialog ):
def __init__( self, parent ):
wx.Dialog.__init__( self )
self.Create( parent, wx.ID_ANY, 'my Dlg Title' )
self._resources = wx.xrc.XmlResource( 'TestDialog.xrc' )
self._resources.LoadDialog( self, 'CTestDialog' )
self.m_button_ok = self._resources.LoadObjectRecursively( self, 'm_button_ok', 'wxButton' )
self.m_textCtrl_name = self._resources.LoadObjectRecursively( self, 'm_textCtrl_name', 'wxTextCtrl' )
button_sizer = self.m_button_ok.GetContainingSizer() # button_sizer is None
self.Layout()
if __name__ == "__main__":
app = wx.App( redirect=False )
dlg = CTestDialog( None )
dlg.ShowModal()
И файл XRC:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<resource xmlns="http://www.wxwindows.org/wxxrc" version="2.3.0.1">
<object class="wxDialog" name="CTestDialog">
<style>wxDEFAULT_DIALOG_STYLE</style>
<title>Test</title>
<centered>1</centered>
<object class="wxBoxSizer">
<orient>wxVERTICAL</orient>
<object class="sizeritem">
<option>1</option>
<flag>wxEXPAND|wxLEFT|wxRIGHT|wxTOP</flag>
<border>5</border>
<object class="wxBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<option>0</option>
<flag>wxLEFT|wxTOP</flag>
<border>3</border>
<object class="wxStaticText" name="m_staticText_name">
<size>80,-1</size>
<label>Name</label>
<wrap>-1</wrap>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxBOTTOM|wxRIGHT</flag>
<border>3</border>
<object class="wxTextCtrl" name="m_textCtrl_name">
<size>180,-1</size>
<value></value>
</object>
</object>
</object>
</object>
<object class="sizeritem">
<option>1</option>
<flag>wxALIGN_RIGHT|wxALL|wxEXPAND</flag>
<border>5</border>
<object class="wxBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<option>0</option>
<flag>wxLEFT</flag>
<border>50</border>
<object class="wxButton" name="m_button_ok">
<label>_OK</label>
<default>0</default>
</object>
</object>
</object>
</object>
</object>
</object>
</resource>
1 ответ
Нашел решение, этот код работает. Во всяком случае, у меня есть ощущение, что это не правильный путь, так как CTestDialog
больше не wxDialog
учебный класс. Комментарии в коде объясняют, что я изменил.
import wx
import wx.xrc
class CTestDialog( object ): # New: this is no more a wxDialog object but it contains one
def __init__( self, parent ):
#wx.Dialog.__init__( self, None, wx.ID_ANY, 'CTestDialog' )
#self.Create( parent, wx.ID_ANY, 'my Dlg Title' )
self._resources = wx.xrc.XmlResource( 'TestDialog.xrc' )
self._dlg = self._resources.LoadDialog( None, 'CTestDialog' ) # New: assign to _dlg
self.m_button_ok = wx.xrc.XRCCTRL( self._dlg , 'm_button_ok' ) # New: XRCCTRL
self.m_textCtrl_name = wx.xrc.XRCCTRL( self._dlg , 'm_textCtrl_name' ) # New: XRCCTRL
self._dlg.Layout() # New: refers to _dlg, no more to self
def ShowModal( self ):
# New: refers to _dlg
return self._dlg.ShowModal()
if __name__ == "__main__":
app = wx.App( redirect=False )
dlg = CTestDialog( None )
dlg.ShowModal()