如何让wx.Panel填充它的父wx.Panel?
How to make wx.Panel fill its parent wx.Panel?
我在理解 sizer 方面遇到了一些困难。
我的框架调用了 AreaPanel class 的 wx.Panel。在激活该面板的情况下按下键盘按钮后,我想创建一个新的 wx.Panel of InventoryPanel class,它应该填充整个 AreaPanel。它没有。我尝试将 Layout() 调用放在不同的地方,但显然这不是原因。
def Initialize():
app = wx.App()
frame = wx.Frame(None, title='Project')
frame.SetSize(width = 1480, height = 600)
arpanel = AreaPanel(frame)
frame.Show()
app.MainLoop()
class AreaPanel(wx.Panel):
def OnKeyPress(self,e):
key = e.GetKeyCode()
print(str(key) + ' on panel: '+self.__class__.__name__)
if key == wx.WXK_ESCAPE:
quit()
elif key == wx.WXK_NUMPAD6:
invpanel = InventoryPanel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(invpanel,wx.GROW,wx.EXPAND)
invpanel.SetSizer(sizer)
self.Layout()
self.Parent.Layout()
def __init__(self, parent):
super().__init__(parent)
self.SetDoubleBuffered(True)
font = wx.Font(9, wx.DEFAULT, wx.NORMAL, wx.DEFAULT)
font.SetFaceName('Courier New')
text = (('AreaPanel label.' * 10) + '\n') * 20
self.mainText = wx.StaticText(parent, label=text, style=wx.ALIGN_LEFT)
self.mainText.SetFont(font)
self.Bind(wx.EVT_KEY_DOWN, self.OnKeyPress)
self.SetFocus()
def DestroyChildPanel(self,child):
child.Destroy()
self.SetFocus()
class InventoryPanel(wx.Panel):
def OnKeyPress(self, e):
key = e.GetKeyCode()
print(str(key) + ' on panel: ' + self.__class__.__name__)
if key == wx.WXK_ESCAPE:
quit()
elif key == 83:
self.Parent.DestroyChildPanel(self)
def __init__(self, parent):
super().__init__(parent)
self.SetDoubleBuffered(True)
font = wx.Font(9, wx.DEFAULT, wx.NORMAL, wx.DEFAULT)
font.SetFaceName('Courier New')
text = (('InventoryPanel label. S to leave.' * 9) + '\n') * 15
self.mainText = wx.StaticText(parent, label=text, style=wx.ALIGN_LEFT)
self.mainText.SetFont(font)
self.Bind(wx.EVT_KEY_DOWN, self.OnKeyPress)
self.SetFocus()
您正在为 InventoryPanel 创建一个 sizer,并将 InventoryPanel 添加到这个 sizer。那是不正确的。
改为为 AreaPanel 创建一个 sizer,并将库存面板添加到它。
(请遵循通常的约定,例如 class 顶部的 init。)
P.S.: 你写道你很难理解 sizer。你可能想试试 wxGlade。下载它并完成它的教程。它包括一个关于 sizer 的部分。
我在理解 sizer 方面遇到了一些困难。
我的框架调用了 AreaPanel class 的 wx.Panel。在激活该面板的情况下按下键盘按钮后,我想创建一个新的 wx.Panel of InventoryPanel class,它应该填充整个 AreaPanel。它没有。我尝试将 Layout() 调用放在不同的地方,但显然这不是原因。
def Initialize():
app = wx.App()
frame = wx.Frame(None, title='Project')
frame.SetSize(width = 1480, height = 600)
arpanel = AreaPanel(frame)
frame.Show()
app.MainLoop()
class AreaPanel(wx.Panel):
def OnKeyPress(self,e):
key = e.GetKeyCode()
print(str(key) + ' on panel: '+self.__class__.__name__)
if key == wx.WXK_ESCAPE:
quit()
elif key == wx.WXK_NUMPAD6:
invpanel = InventoryPanel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(invpanel,wx.GROW,wx.EXPAND)
invpanel.SetSizer(sizer)
self.Layout()
self.Parent.Layout()
def __init__(self, parent):
super().__init__(parent)
self.SetDoubleBuffered(True)
font = wx.Font(9, wx.DEFAULT, wx.NORMAL, wx.DEFAULT)
font.SetFaceName('Courier New')
text = (('AreaPanel label.' * 10) + '\n') * 20
self.mainText = wx.StaticText(parent, label=text, style=wx.ALIGN_LEFT)
self.mainText.SetFont(font)
self.Bind(wx.EVT_KEY_DOWN, self.OnKeyPress)
self.SetFocus()
def DestroyChildPanel(self,child):
child.Destroy()
self.SetFocus()
class InventoryPanel(wx.Panel):
def OnKeyPress(self, e):
key = e.GetKeyCode()
print(str(key) + ' on panel: ' + self.__class__.__name__)
if key == wx.WXK_ESCAPE:
quit()
elif key == 83:
self.Parent.DestroyChildPanel(self)
def __init__(self, parent):
super().__init__(parent)
self.SetDoubleBuffered(True)
font = wx.Font(9, wx.DEFAULT, wx.NORMAL, wx.DEFAULT)
font.SetFaceName('Courier New')
text = (('InventoryPanel label. S to leave.' * 9) + '\n') * 15
self.mainText = wx.StaticText(parent, label=text, style=wx.ALIGN_LEFT)
self.mainText.SetFont(font)
self.Bind(wx.EVT_KEY_DOWN, self.OnKeyPress)
self.SetFocus()
您正在为 InventoryPanel 创建一个 sizer,并将 InventoryPanel 添加到这个 sizer。那是不正确的。 改为为 AreaPanel 创建一个 sizer,并将库存面板添加到它。 (请遵循通常的约定,例如 class 顶部的 init。) P.S.: 你写道你很难理解 sizer。你可能想试试 wxGlade。下载它并完成它的教程。它包括一个关于 sizer 的部分。