无法将面板放在wxpython上的指定位置

时间:2014-01-04 08:26:07

标签: python wxpython

如果我不评论self.panel1,我可以得到正确的结果。如果我评论self.panel1。 panel2无法在位置(200,0)渲染。它采用全帧窗口。

以下是我的代码

#!/usr/bin/env python
import wx

class MyForm(wx.Frame):
   def __init__(self):
        wx.Frame.__init__(self, None, size=(400,400))    

        # self.panel1=wx.Panel(parent=self,
        #                      size=(200,200),
        #                      pos=(0,0),
        #                      style=wx.BORDER)            

        self.panel2=wx.Panel(parent=self,
                             size=(200,200),
                             pos=(200,0),
                             style=wx.BORDER)


# Run the program
app = wx.App(False)
frame = MyForm().Show()
app.MainLoop()

1 个答案:

答案 0 :(得分:1)

根据wxWidget - wxFrame documentation

  

wxFrame处理以下事件:

     

wxEVT_SIZE如果框架只有一个子窗口,则不计算   在状态和工具栏中,调整此子项的大小以占用整个帧   客户区。如果有两个或多个窗户,则应铺设   通过手动处理wxEVT_SIZE或使用sizer来明确显示;

解决方法:在以下示例中创建一个额外的面板(outer_panel)以包含单个面板。

import wx

class MyForm(wx.Frame):
   def __init__(self):
        wx.Frame.__init__(self, None, size=(400,400))    
        self.outer_panel = wx.Panel(self) # <--------------
        self.panel2=wx.Panel(parent=self.outer_panel,
                             size=(200,200),
                             pos=(200,0),
                             style=wx.BORDER)
        self.panel2.SetBackgroundColour(wx.RED)

app = wx.App(False)
MyForm().Show()
app.MainLoop()

<强>更新 Robin Dunn建议的另一个解决方案; catch frame的EVT_SIZE以防止调用默认处理程序。

import wx

class MyForm(wx.Frame):
   def __init__(self):
        wx.Frame.__init__(self, None, size=(400,400))
        self.Bind(wx.EVT_SIZE, lambda *args: 0) # <--------
        self.panel2=wx.Panel(parent=self,
                             size=(200,200),
                             pos=(200,0),
                             style=wx.BORDER)


app = wx.App(False)
frame = MyForm().Show()
app.MainLoop()