当前位置: 首页 > 知识库问答 >
问题:

Python wxWidget:将组件添加到面板会触发wxWindowBase::AddCHild():在Windows上调用两次断言

姜华翰
2023-03-14

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

wx._core.PyAssertionError: C++ assertion "!GetChildren().Find((wxWindow*)child)" failed at ..\..\src\common\wincmn.cpp(945) in wxWindowBase::AddChild(): AddChild() called twice

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

感谢任何帮助。

"""
Defines the main GUI panel for the app.
"""
import wx

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

    def createGui(self):
        """
        Create controls on the main panel UI.  We use fixed positioning over layout managers as it gives a cleaner looking result.
        """
        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, "Generator Power" , 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(self, event):
        """
        Paint the background with a slight gradient
        """
        dc = wx.PaintDC(self)
        x = 0
        y = 0
        w, h = self.GetSize()
        dc.GradientFillLinear((x, y, w, h), 'white', 'light grey', nDirection = wx.SOUTH)

共有1个答案

东方宜
2023-03-14

绝不能像留档中明确提到的那样调用addChilds()

您还应该意识到,使用绝对位置是一个非常糟糕的主意,在实践中,它永远不会起作用,尤其是在使用像素(而不是对话框单位)时。

 类似资料:
  • 我正在构建一个Java程序。该程序的核心在JFrame中可视化,其中包含一个JMenuBar和各种JMenuItem和JMenu。关键是我在所有框架中添加了一个centralPanel,但是如果我在centralPanel中添加了一些内容,那么只有在调整主框架的大小、缩小或放大它时,它才会显示出来!代码如下: 这是构造函数: 在这里,我添加了中央面板,在这里,在ActionListener中,我试

  • 问题内容: 我有一个ajax电话 现在,这里是10分钟后收到的答复。因此,ajax调用被多次调用。为什么会发生这种情况/我们如何确保ajax调用仅被调用一次? 问题答案: 禁用按钮的另一种方法是使用.one()方法,并在回调后重新绑定事件处理程序:

  • 我有一个聊天应用程序,当我在输入消息后单击按钮时,消息会发布到我的DynamoDB表中。该应用程序应该发布一次消息,但不知何故发布了两次。 管道如下: 客户端单击“发送”按钮-- 在SO的帮助下,我已经将问题隔离到我的Google Cloud函数异步调用Lambda,该函数将Lambda排队两次。 使用async,请求在实际执行之前排队。所以,如果您调用它一次,AWS将检查是否已经有一个正在执行,

  • 问题内容: 我有以下代码,但我的问题是该事件被触发了两次。我不知道是什么原因造成的。我怀疑是由供应商前缀引起的,但并非如此。即使我只离开,它仍然会开火两次。 CSS JS 问题答案: 对于您和,每个已转换的属性都会触发。 您可以在访问与事件关联的属性。 没有“ transition s end”事件,因此您可能需要一些技巧,例如仅过滤其中一个过渡属性的回调处理。例如: ps。没有浏览器会触发该事件

  • 我是个新手,所以不要用任何非技术性的词语。我有一个父组件,它在单击按钮时有一个按钮元素,调用一个函数来创建一个新对象。我想要的是,当用户单击这个按钮时,子组件应该呈现在父按钮元素下面,每次单击按钮时,新对象应该作为道具传递给子组件,以便它可以在屏幕上显示它,但以前调用的子组件应该保留在屏幕上。 从React导入; 类父母组件扩展反应。PureComponent{ }

  • 问题内容: 运行时,它将软件包安装在我的用户/ AppData / Roaming / npm / npm_modules /文件夹中。该子文件夹不在我的PATH中,因此,如果我尝试运行该程序包而不显式调用整个路径,则调用失败,并显示一个 我该怎么做才能解决此问题? 谢谢 问题答案: 我使用的是win8.1,发现nodejs安装程序未将全局节点模块的路径添加到系统PATH。只需添加到 用户变量 (