0

我有一个带有框架的 GUI,我正在尝试将主要内容放入面板中,并使用绝对定位向其中添加组件。这在 Linux 上运行,但是当我在 Windows 上运行它时,有一个断言触发说明:

wx._core.PyAssertionError: C++ 断言 "!GetChildren().Find((wxWindow*)child)" 在 wxWindowBase::AddChild() 中的 ..\..\src\common\wincmn.cpp(945) 失败:AddChild () 调用了两次

这是由我添加到面板的第一个组件触发的。所以我的问题是如何解决这个问题,为什么这个问题不会在 Linux 上发生?

谢谢你的帮助。

"""
定义应用程序的主 GUI 面板。
"""
导入 wx

类 MainGuiPanel(wx.Panel):
    def __init__(self, parent, size):
        wx.Panel.__init__(self, parent, size=size)
        self.SetMinSize(大小)
        self.Bind(wx.EVT_PAINT, self.on_paint)
        self.createGui()

    def createGui(self):
        """
        在主面板 UI 上创建控件。我们在布局管理器上使用固定定位,因为它可以提供更清晰的结果。
        """
        x = 7
        y = 8
        self.AddChild(wx.StaticText(self, -1, "PV Power" , wx.Point(x, y)))
        self.pvPowerTF = wx.TextCtrl(self,-1, "0 kW", wx.Point(x + 105, y - 2), wx.Size(100, 20), style=wx.TE_READONLY)
        self.AddChild(self.pvPowerTF)

        y += 28
        self.AddChild(wx.StaticText(self, -1, "Load Power" , wx.Point(x, y)))
        self.loadPowerTF = wx.TextCtrl(self,-1, "0 kW", wx.Point(x + 105, y - 2), wx.Size(100, 20), style=wx.TE_READONLY)
        self.AddChild(self.loadPowerTF)

        y += 28
        self.AddChild(wx.StaticText(self, -1, "发电机功率" , wx.Point(x, y)))
        self.generatorPowerTF = wx.TextCtrl(self,-1, "0 kW", wx.Point(x + 105, y - 2), wx.Size(100, 20), style=wx.TE_READONLY)
        self.AddChild(self.generatorPowerTF)


    def on_paint(自我,事件):
        """
        用轻微的渐变绘制背景
        """
        dc = wx.PaintDC(self)
        x = 0
        y = 0
        w, h = self.GetSize()
        dc.GradientFillLinear((x, y, w, h), '白色', '浅灰色', nDirection = wx.SOUTH)
4

1 回答 1

2

您决不能像文档AddChild()中明确提到的那样称呼自己。

您还应该意识到,使用绝对位置是一个非常糟糕的主意,在实践中根本不会奏效,尤其是在使用像素(而不是对话单元)时。

于 2013-10-20T11:43:20.637 回答