将wxpython面板类添加到sizers中

2 投票
1 回答
4768 浏览
提问于 2025-04-16 17:24

我想在一个框架类中给一个布局管理器添加面板类,然后在代码的主线中调用它。

我遇到的错误是 TypeError: wx.Window, wx.Sizer, wx.Size, or (w,h) expected for item。我猜这个错误是因为我使用的是面板类,而不是面板类的实例。

无论如何,我该怎么做呢?

代码如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import wx

class step_1(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, id=wx.ID_ANY)

        sizer = wx.BoxSizer(wx.VERTICAL)
        txtOne = wx.TextCtrl(self, wx.ID_ANY, "")

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(txtOne, 0, wx.ALL, 5)

        self.SetSizer(sizer)

class step_2(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, id=wx.ID_ANY)

        sizer = wx.BoxSizer(wx.VERTICAL)
        txtOne = wx.TextCtrl(self, wx.ID_ANY, "")

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(txtOne, 0, wx.ALL, 5)

        self.SetSizer(sizer)

class main_frame(wx.Frame):
    """Main Frame holding the main panel."""
    def __init__(self,*args,**kwargs):
        wx.Frame.__init__(self,*args,**kwargs)
        p = wx.Panel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(step_1,0,border = 5)
        sizer.Add(step_2,0,border = 5)
        p.SetSizerAndFit(sizer)
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = main_frame(None,-1,size = (400,300))
    app.MainLoop()

1 个回答

4

就像你自己说的那样:你没有把 step_1step_2 这两个类的实例传给 sizer,这当然是应该做的。你只需要创建它们的实例就可以了:

class main_frame(wx.Frame):
    """Main Frame holding the main panel."""
    def __init__(self,*args,**kwargs):
        wx.Frame.__init__(self,*args,**kwargs)
        p = wx.Panel(self)

        stp1 = step_1(p) 
        stp2 = step_2(p) 

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(stp1, 0, border = 5)
        sizer.Add(stp2, 0, border = 5)
        p.SetSizerAndFit(sizer)
        self.Show()

撰写回答