将对话框代码移植到Python3和phoenix时布局错误

2024-03-29 11:37:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用wxpythonphoenix将旧的python2.7代码移植到3.6版本,而现在我在wxdialog中遇到了无法获得正确布局的问题。所有wigdet都显示在窗口的左上角。有人能帮忙吗?你知道吗

我使用python3.6.4、wxpython4.0.1 msw(phoenix)。XRC文件是用wxformbuilder3.5生成的。你知道吗

这就是我所期望的(由wxFormBuilder显示):

expected dialog layout

这就是我得到的:

actual dialog layout

先谢谢你

敬礼

编辑 我试图通过self.m_button_ok.GetContainingSizer()获得包含按钮的sizer。此方法返回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>

Tags: nameselfsizeobjectbuttonokclassflag
1条回答
网友
1楼 · 发布于 2024-03-29 11:37:05

找到了一个解决方案,这个代码就行了。不管怎样,我觉得这不是正确的方法,因为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()

相关问题 更多 >