如果我不评论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()
答案 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()