我有一个应用程序,其中我想使用一个面板来保存我可以拖放的图像,以及一个可以保存各种控件的图像
我无法正确显示图像面板:
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线被注释掉它可以工作;如果没有评论,它只会在左上角显示为一个小方框
有人可以帮忙吗?
答案 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-的默认行为,我会过得更好的一天)