将笔记本放在wxpython中的拆分窗口上

将笔记本放在wxpython中的拆分窗口上,python,user-interface,wxpython,Python,User Interface,Wxpython,当我尝试运行下面的代码时,出现以下错误: Can't create window of class wxWindowNR (error 1406: cannot create a top-level child window.) 这里有什么问题 代码: 导入操作系统 导入系统 导入wx 从datetime导入datetime,timedelta szflags=wx.EXPAND | wx.ALL 最小高度=50 高度比=4 b订单=10 lborder=5 类TangoArtProvider

当我尝试运行下面的代码时,出现以下错误:

Can't create window of class wxWindowNR (error 1406: cannot create a top-level child window.)
这里有什么问题

代码:

导入操作系统
导入系统
导入wx
从datetime导入datetime,timedelta
szflags=wx.EXPAND | wx.ALL
最小高度=50
高度比=4
b订单=10
lborder=5
类TangoArtProvider(wx.ArtProvider):
定义初始化(自):
超级(TangoArtProvider,self)。\uuu初始化
self.path=os.path.join(os.getcwd(),“icons”)
self.bmps=[bmp.replace('.png','')
用于os.listdir(self.path)中的bmp
如果bmp.endswith('.png')]
打印self.bmps
def CreateBitmap(self,id,client=wx.ART_OTHER,size=wx.DefaultSize):
如果wx.Platform='\uuu WXGTK\uuuu':
返回wx.null位图
bmp=wx.null位图
如果self.bmps中有id:
path=os.path.join(self.path,id+'.png')
bmp=wx.Bitmap(路径)
其他:
通过
返回bmp
类别图表面板(wx.Panel):
定义初始化(self,*args,**kwargs):
wx.Panel.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.setbackgroundColor(“绿色”)
self.st=wx.StaticText(self,label='CHART PANEL')
sizer=wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.st、0、szflags、lborder)
自整定器(施胶器)
课堂笔记簿页面(wx.Panel):
定义初始化(self,*args,**kwargs):
wx.Panel.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.chartPanel=chartPanel(self,name='Notebook\u Page\u chartPanel')
sizer=wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.chartPanel,height_ratio,szflags,pborder)
自整定器(施胶器)
课堂笔记本(wx笔记本):
定义初始化(self,*args,**kwargs):
wx.Notebook.\uuuuu初始化(self,*args,**kwargs)
#self.setbackgroundColor(“粉色”)
self.nbPages={}
车队=[“333”]
第九页=0
对于车队中的车队:
self.nbPages[fleets.index(fleet)]=NotebookPage(self,name='NotebookPage0')
对于车队中的车队:
self.AddPage(self.nbPages[fleets.index(fleet)],fleet,True)
类别图表面板(wx.Panel):
定义初始化(self,*args,**kwargs):
wx.Panel.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
#self.st=wx.StaticText(self,label='Chart Panel')
self.noteBook=笔记本(self,name='noteBook')
sizer=wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.noteBook,1,szflags)
自整定器(施胶器)
类别设置面板(wx.面板):
定义初始化(self,*args,**kwargs):
wx.Panel.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.st=wx.StaticText(self,label='Settings Panel')
self.sizer=wx.BoxSizer(wx.VERTICAL)
self.sizer.Add(self.st、0、szflags)
自调整器(自调整器)
类输出面板(wx.Panel):
定义初始化(self,*args,**kwargs):
wx.Panel.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.st=wx.StaticText(self,label='Output Panel')
self.sizer=wx.BoxSizer(wx.VERTICAL)
self.sizer.Add(self.st、0、szflags)
自调整器(自调整器)
类比例拆分器(wx.SplitterWindow):
def u uu init_uuuu(self,parent,id=-1,proporty=0.66,size=wx.DefaultSize,**kwargs):
wx.SplitterWindow.\uuuuu init\uuuuuuux(self,parent,id,wx.Point(0,0),size,**kwargs)
self.setminimumpanese(50)#窗格的最小尺寸。
自成比例
如果不是0<自身比例<1:
raise value ERROR,“比例拆分器的比例值必须介于0和1之间。”
self.ResetSash()
self.Bind(wx.EVT_SIZE,self.OnReSize)
self.Bind(wx.EVT\u SPLITTER\u SASH\u POS\u已更改,self.OnSashChanged,id=id)
##在第一次喷漆事件中设置尺寸
self.Bind(wx.EVT_-PAINT,self.OnPaint)
self.firstpaint=True
def水平拆分(自、win1、win2):
如果self.GetParent()为None:返回False
返回wx.SplitterWindow.splitanvely(self、win1、win2、,
int(舍入(self.GetParent().GetSize().GetHeight()*self.proportion)))
def垂直拆分(自、win1、win2):
如果self.GetParent()为None:返回False
返回wx.SplitterWindow.splitvertical(self、win1、win2、,
int(舍入(self.GetParent().GetSize().GetWidth()*self.proportion)))
def GetExpectedSashPosition(自身):
如果self.GetSplitMode()==wx.SPLIT\u水平:
tot=max(self.getMinimumPanese(),self.GetParent().GetClientSize().height)
其他:
tot=max(self.getMinimumPanese(),self.GetParent().GetClientSize().width)
返回整数(四舍五入(总和*自身比例))
def重置安全带(自身):
self.SetSashPosition(self.GetExpectedSashPosition())
def OnReSize(自我,事件):
窗口已调整大小,因此我们需要根据自身比例调整窗扇
self.ResetSash()
event.Skip()
def OnSashChanged(自身、事件):
“我们现在将根据用户拖动窗框的位置更改self.proportion。”
pos=float(self.GetSashPosition())
如果self.GetSplitMode()==wx.SPLIT\u水平:
tot=max(self.getMinimumPanese(),self.GetParent().GetClientSize().height)
其他:
tot=max(self.getMinimumPanese(),self.GetParent().GetClientSize().width)
自身比例=pos/tot
event.Skip()
def OnPaint(自身、事件):
如果self.firstpaint:
如果self.GetSashPosition()!=self.GetExpectedSashPosition():
self.ResetSash()
self.firstpaint=False
event.Skip()
类MainFr
import os
import sys
import wx
from datetime import datetime, timedelta

szflags = wx.EXPAND | wx.ALL
min_height = 50
height_ratio = 4
pborder = 10
lborder = 5

class TangoArtProvider(wx.ArtProvider):
    def __init__(self):
        super(TangoArtProvider, self).__init__()
        self.path = os.path.join(os.getcwd(), "icons")
        self.bmps = [bmp.replace('.png', '')
                    for bmp in os.listdir(self.path)
                    if bmp.endswith('.png')]
        print self.bmps

    def CreateBitmap(self, id, client=wx.ART_OTHER, size=wx.DefaultSize):
        if wx.Platform == '__WXGTK__':
            return wx.NullBitmap
        bmp = wx.NullBitmap
        if id in self.bmps:
                path = os.path.join(self.path, id+'.png')
                bmp = wx.Bitmap(path)
        else:
            pass
        return bmp   

class ChartPanel(wx.Panel):

    def __init__(self, *args, **kwargs):
        wx.Panel.__init__(self, *args, **kwargs)
        self.SetBackgroundColour('GREEN')

        self.st = wx.StaticText(self, label='CHART PANEL')

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.st, 0 , szflags , lborder)
        self.SetSizer(sizer)

class NotebookPage(wx.Panel):

    def __init__(self, *args, **kwargs):
        wx.Panel.__init__(self, *args, **kwargs)

        self.chartPanel = ChartPanel(self, name='Notebook_Page_ChartPanel')

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.chartPanel, height_ratio, szflags, pborder)
        self.SetSizer(sizer) 

class Notebook(wx.Notebook):

    def __init__(self, *args, **kwargs):
        wx.Notebook.__init__(self, *args, **kwargs)
        #self.SetBackgroundColour('PINK')

        self.nbPages = {}
        fleets = ["333"]
        page_ix = 0
        for fleet in fleets:
            self.nbPages[fleets.index(fleet)] = NotebookPage(self, name='NotebookPage0')

        for fleet in fleets:
            self.AddPage(self.nbPages[fleets.index(fleet)], fleet, True)




class ChartPanel(wx.Panel):

    def __init__(self, *args, **kwargs):
        wx.Panel.__init__(self, *args, **kwargs)
        #self.st = wx.StaticText(self, label='Chart Panel')

        self.noteBook = Notebook(self, name='Notebook')

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.noteBook, 1, szflags)
        self.SetSizer(sizer) 

class SettingsPanel(wx.Panel):

    def __init__(self, *args, **kwargs):
        wx.Panel.__init__(self, *args, **kwargs)

        self.st = wx.StaticText(self, label='Settings Panel')

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.st, 0, szflags)
        self.SetSizer(self.sizer)   

class OutputPanel(wx.Panel):

    def __init__(self, *args, **kwargs):
        wx.Panel.__init__(self, *args, **kwargs)

        self.st = wx.StaticText(self, label='Output Panel')

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.st, 0, szflags)
        self.SetSizer(self.sizer)         



class ProportionalSplitter(wx.SplitterWindow):
        def __init__(self,parent, id = -1, proportion=0.66, size = wx.DefaultSize, **kwargs):
                wx.SplitterWindow.__init__(self,parent,id,wx.Point(0, 0),size, **kwargs)
                self.SetMinimumPaneSize(50) #the minimum size of a pane.
                self.proportion = proportion
                if not 0 < self.proportion < 1:
                        raise ValueError, "proportion value for ProportionalSplitter must be between 0 and 1."
                self.ResetSash()
                self.Bind(wx.EVT_SIZE, self.OnReSize)
                self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGED, self.OnSashChanged, id=id)
                ##hack to set sizes on first paint event
                self.Bind(wx.EVT_PAINT, self.OnPaint)
                self.firstpaint = True

        def SplitHorizontally(self, win1, win2):
                if self.GetParent() is None: return False
                return wx.SplitterWindow.SplitHorizontally(self, win1, win2,
                        int(round(self.GetParent().GetSize().GetHeight() * self.proportion)))

        def SplitVertically(self, win1, win2):
                if self.GetParent() is None: return False
                return wx.SplitterWindow.SplitVertically(self, win1, win2,
                        int(round(self.GetParent().GetSize().GetWidth() * self.proportion)))

        def GetExpectedSashPosition(self):
                if self.GetSplitMode() == wx.SPLIT_HORIZONTAL:
                        tot = max(self.GetMinimumPaneSize(),self.GetParent().GetClientSize().height)
                else:
                        tot = max(self.GetMinimumPaneSize(),self.GetParent().GetClientSize().width)
                return int(round(tot * self.proportion))

        def ResetSash(self):
                self.SetSashPosition(self.GetExpectedSashPosition())

        def OnReSize(self, event):
                "Window has been resized, so we need to adjust the sash based on self.proportion."
                self.ResetSash()
                event.Skip()

        def OnSashChanged(self, event):
                "We'll change self.proportion now based on where user dragged the sash."
                pos = float(self.GetSashPosition())
                if self.GetSplitMode() == wx.SPLIT_HORIZONTAL:
                        tot = max(self.GetMinimumPaneSize(),self.GetParent().GetClientSize().height)
                else:
                        tot = max(self.GetMinimumPaneSize(),self.GetParent().GetClientSize().width)
                self.proportion = pos / tot
                event.Skip()

        def OnPaint(self,event):
                if self.firstpaint:
                        if self.GetSashPosition() != self.GetExpectedSashPosition():
                                self.ResetSash()
                        self.firstpaint = False
                event.Skip()

class MainFrame(wx.Frame):

    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        self.SetBackgroundColour('YELLOW')

        self.CreateStatusBar(2)
        self.SetStatusWidths([-2, -1])

        #=======================================================================
        # toolbar = self.CreateToolBar()
        # toolbar.SetToolBitmapSize((20,20))      
        # icon_size = (32,32)          
        # 
        # wx.ArtProvider.PushProvider(TangoArtProvider())
        # 
        # run = wx.ArtProvider.GetBitmap("forward", wx.ART_TOOLBAR, icon_size)
        # settings = wx.ArtProvider.GetBitmap("tools", wx.ART_TOOLBAR, icon_size)
        # quit = wx.ArtProvider.GetBitmap("quit", wx.ART_TOOLBAR, icon_size)
        # toolbar.AddSimpleTool(1, run, "Run", "Run the report")
        # toolbar.AddSimpleTool(2, settings, "Settings", "Change program settings")
        # toolbar.AddSimpleTool(3, quit, "Quit", "Exit Program")
        # 
        # toolbar.Realize()      
        #=======================================================================

        self.split1 = ProportionalSplitter(self,-1, 0.66)
        self.split2 = ProportionalSplitter(self.split1,-1, 0.50)

        print "line 200"
        self.rightpanel = ChartPanel(self.split1)
        self.rightpanel.SetBackgroundColour('cyan')
        print "line 203"
        self.topleftpanel = SettingsPanel(self.split2)
        self.topleftpanel.SetBackgroundColour('pink')
        print "line 206"
        self.bottomleftpanel = OutputPanel(self.split2)
        self.bottomleftpanel.SetBackgroundColour('sky Blue')

        ## add your controls to the splitters:
        self.split1.SplitVertically(self.split2, self.rightpanel)
        self.split2.SplitHorizontally(self.topleftpanel, self.bottomleftpanel)                  


class App(wx.App):

    def OnInit(self):
        self.mainFrame = MainFrame(None, 
            size=(1000, 80*10), 
            title='Report', name='MainFrame')

        wx.GetApp().SetTopWindow( self.mainFrame )

        self.mainFrame.Show()

        return True

def main(*args, **kwargs):
    """A nice place to process things before MainLoop"""
    global app

    import wx.lib.inspection

    app = App()
    #wx.lib.inspection.InspectionTool().Show()
    app.MainLoop()


if __name__ == "__main__":
    app = None
    main()