wxPython - 窗体闪现后消失

0 投票
2 回答
607 浏览
提问于 2025-04-18 09:29

我写了一段简单的代码,目的是显示一个按钮的网格。但是在运行的时候,窗口一闪而过,最后出现了一个错误,内容是:

wx._core.PyAssertionError: C++ 断言 "m_hDWP" 在 ....\src\msw\window.cpp(5168) 的 wxWindow::EndRepositioningChildren() 中失败:不应该被调用

这个程序里有一个菜单栏和一个按钮的网格。菜单栏和按钮网格都是通过一个叫做 boxsizer 的工具放在窗口里的。

我现在搞不清楚怎么才能让它正常工作。如果有人能帮忙,我会非常感激。

[编辑]:去掉 self.SetMenubar(menubar) 这一行后,程序在没有菜单栏的情况下可以正常运行。

这是我的代码:

import wxversion
wxversion.select("3.0")

import wx

class Main(wx.Frame):
    def __init__(self,parent,id,title):    
        wx.Frame.__init__(self,parent,id,title)
        self.SetBackgroundColour(wx.BLUE)

        menubar = wx.MenuBar()

        menu_1 = wx.Menu()
        menu_1.Append(-1,'Open','&Open')
        menu_1.Append(-1,'Save','&Save')

        menu_2 = wx.Menu()
        menu_2.AppendCheckItem(-1,'Sound On','&Sound On')

        menu_3 = wx.Menu()
        menu_3.Append(-1,'Help','&Help')
        menu_3.Append(-1,'About','&About')

        menubar.Append(menu_1,'File')
        menubar.Append(menu_2,'Settings')
        menubar.Append(menu_3,'Help')
        self.SetMenuBar(menubar) ## REMOVING THIS MAKES IT WORK, BUT WITHOUT THE MENU BAR ##


        vsizer = wx.BoxSizer(wx.VERTICAL)
        gsizer = wx.GridSizer(6,6,2,2)
        self.btn = range(36)

        for ix in range(0,36):
            self.btn[ix] = wx.Button(self,ix+1000,'Title',(10,10))
            gsizer.Add(self.btn[ix], 0, wx.ALL|wx.EXPAND, border=2)

        vsizer.Add(menubar,-1,wx.EXPAND|wx.ALL)
        vsizer.Add(gsizer, 0, wx.EXPAND|wx.ALL, border=2)

        self.SetSizer(vsizer)
        self.Center()
        self.Show(True)


a = wx.App()
h = Main(None,-1,'App')
h.Show(True)
a.MainLoop()

2 个回答

0

我觉得问题出在你的缩进上。你需要在类的外面构建这个应用。在你上面的例子中,你把它设置成了类的实例。只要把这些行的缩进去掉,就可以正常工作了。

a = wx.App()
h = Main(None,-1,'App')
h.Show(True)
a.MainLoop()
0

其实Joran Beasley说得对:你不应该把菜单栏加到一个sizer里(这样做有什么意义呢?),这和是不同的。

只需要把下面的代码注释掉

    # vsizer.Add(menubar,-1,wx.EXPAND|wx.ALL)

这样在2.9.5和3.0.1b版本上就能正常工作了(我想3.0版本也可以)。

撰写回答