wx python如何在sizer中放置面板

时间:2017-07-27 15:51:04

标签: wxpython

我有一个应用程序,其中我想使用一个面板来保存我可以拖放的图像,以及一个可以保存各种控件的图像

我无法正确显示图像面板:

import  wx

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1,
                          'Display panels',
                            size=(900, 700))
        sizer = wx.GridBagSizer()
        image_panel = ImagePanel(self)
        sizer.Add(image_panel, pos=(1, 2))
        #self.SetSizer(sizer)
        self.Centre()
        self.Show()

class ImagePanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.Bind(wx.EVT_PAINT, self.on_paint)

    def on_paint(self, event):
        dc = wx.PaintDC(self)
        dc.Clear()
        self.PrepareDC(dc)
        dc = wx.PaintDC(self)
        dc.SetPen(wx.Pen(wx.BLACK, 4))
        dc.DrawLine(0, 0, 500, 500)

if __name__ == '__main__':
    screen_app = wx.App()
    main_frame = MainFrame()
    screen_app.MainLoop()

如果SetSizer线被注释掉它可以工作;如果没有评论,它只会在左上角显示为一个小方框

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

它们的关键是拥有一个面板,它是框架的唯一子窗口小部件。然后将其他面板添加为该顶级面板的子项。

现在,我更倾向于使用wx.BoxSizer而不是wx.GridBagSizer,尽管我确信你可以让它发挥作用。无论如何,对于这个例子,我将使用BoxSizer:

import  wx

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1,
                          'Display panels',
                            size=(900, 700))
        main_panel = wx.Panel(self)

        sizer = wx.BoxSizer(wx.VERTICAL)
        image_panel = ImagePanel(main_panel)
        sizer.Add(image_panel, 1, wx.EXPAND|wx.ALL, 5)

        # Add your control panel here

        main_panel.SetSizer(sizer)
        self.Centre()
        self.Show()

class ImagePanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.Bind(wx.EVT_PAINT, self.on_paint)

    def on_paint(self, event):
        dc = wx.PaintDC(self)
        dc.Clear()
        self.PrepareDC(dc)
        dc = wx.PaintDC(self)
        dc.SetPen(wx.Pen(wx.BLACK, 4))
        dc.DrawLine(0, 0, 500, 500)

if __name__ == '__main__':
    screen_app = wx.App()
    main_frame = MainFrame()
    screen_app.MainLoop()

正如您所看到的,当我们将ImagePanel添加到sizer时,我也传递它应该是1的比例,这意味着ImagePanel应该占用100%的空间。我还传递wx.EXPAND标志,告诉wxPython扩展该小部件以填充空间。

你可以用GridBagSizer做类似的事情,但是你需要让小部件跨越单元格边界,坦率地说,我发现它有点痛苦。如果您真的想使用该sizer,欢迎您深入了解文档。

答案 1 :(得分:0)

ImagePanel似乎需要固定的大小,可以根据显示/绘制的图像进行修改,但没有动态变化。因此,如果子面板具有固定大小,则wx.Sizer.Add的wx.FIXED_MINSIZE选项将完成所需的操作。

(显然,多年后此答案对OP毫无帮助,但如果有人发布有关此晦涩的设置-应该是IMO-的默认行为,我会过得更好的一天)