wxPython - 窗体闪现后消失
我写了一段简单的代码,目的是显示一个按钮的网格。但是在运行的时候,窗口一闪而过,最后出现了一个错误,内容是:
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版本也可以)。