我正在尝试创建一个带有wx.Notebook的项目工具,其顶部是标签,底部是常规面板。底部面板应独立于笔记本电脑,并且在标签更改时不会更改。当我只添加笔记本时,笔记本本身工作正常,但当我还添加我的底部面板(扩展的wx.Panel)时,笔记本会被压缩,如图像here所示。
我有一个窗口面板,并将笔记本和底部面板(称为BottomGroup,扩展wx.Panel)添加到单独的面板。谁能发现麻烦?也许是sizer的东西?我的窗口是这样的(没关系,标签是错误的):
class Window(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, None, wx.ID_ANY, title)
self.InitUI()
def InitUI(self):
menuBar = wx.MenuBar()
menu = wx.Menu()
menu_load = menu.Append(wx.ID_OPEN, 'Open', 'Open project')
menu_save = menu.Append(wx.ID_SAVE, 'Save', 'Save project')
menu_save_as = menu.Append(wx.ID_SAVEAS, 'Save as', 'Save project as')
menu_exit = menu.Append(wx.ID_EXIT, 'Quit', 'Quit application')
menuBar.Append(menu, '&File')
self.SetMenuBar(menuBar)
mainPanel = wx.Panel(self)
self.noteBookPanel = wx.Panel(mainPanel)
self.notebook = wx.Notebook(self.noteBookPanel)
self.bottomPanel = wx.Panel(mainPanel)
self.bottomGroup = BottomGroup(self.bottomPanel)
mainSizer = wx.BoxSizer(wx.VERTICAL)
self.pageNodePathsTables = PageNodesPathsTables(self.notebook)
self.pageEscapeCriteria = PageEscapeCriteria(self.notebook)
self.pageFileHandling = PageFileHandling(self.notebook)
self.notebook.AddPage(self.pageNodePathsTables, "Define Paths and Nodes")
self.notebook.AddPage(self.pageEscapeCriteria, "Define Escape Criteria")
self.notebook.AddPage(self.pageFileHandling, "File Handling")
mainSizer.Add(self.noteBookPanel,1,wx.TOP)
mainSizer.Add(self.bottomGroup,1,wx.BOTTOM)
self.Bind(wx.EVT_MENU, self.onSave, menu_save)
self.Bind(wx.EVT_MENU, self.onLoad, menu_load)
self.Bind(wx.EVT_MENU, self.OnQuit, menu_exit)
self.SetDimensions(WindowOpenX,WindowOpenY,WindowWidth,WindowHeight)
self.Show(True)
更新
我已经重构了我的代码(只显示了重构的部分):
self.notebook = wx.Notebook(self)
self.bottomGroup = BottomGroup(self)
self.setupMenu()
#frameSizer = wx.GridBagSizer(rowGap,columnGap)
#frameSizer.Add(self.notebook,pos=(0,0), span=(1,1),
# flag=wx.LEFT|wx.TOP|wx.EXPAND, border = 5)
#frameSizer.Add(self.bottomGroup,pos=(1,0), span=(1,1),
# flag=wx.LEFT|wx.BOTTOM|wx.EXPAND, border = 5)
frameSizer = wx.BoxSizer(wx.VERTICAL)
frameSizer.Add(self.notebook, 2, wx.EXPAND)
frameSizer.Add(self.bottomGroup,0)
self.SetSizer(frameSizer)
其中self.setupMenu()
定义为:
def setupMenu(self):
self.pageNodePathsTables = PageNodesPathsTables(self.notebook)
self.pageEscapeCriteria = PageEscapeCriteria(self.notebook)
self.pageFileHandling = PageFileHandling(self.notebook)
self.pagePlotHistoryData = PagePlotHistoryData(self.notebook)
self.pageCalculateEscape = PageCalculateEscape(self.notebook)
self.notebook.AddPage(self.pageNodePathsTables, "Define Paths and Nodes")
self.notebook.AddPage(self.pageEscapeCriteria, "Define Escape Criteria")
self.notebook.AddPage(self.pageFileHandling, "File Handling")
self.notebook.AddPage(self.pagePlotHistoryData, "Plot History Data")
self.notebook.AddPage(self.pageCalculateEscape, "Calculate Escape")
这比上面的代码更清晰,更容易。它工作正常,只是bottomGroup
现在堆叠在notebook
上(即两个元素都从wx.Frame的左上角开始)。我已经尝试了wx.BoxSizer
和wx.GridBagLayout
(如上所述)。你对这个问题有什么建议吗?
我的BottomGroup定义如下:
class BottomGroup(wx.Panel):
def __init__(self,parent):
wx.Panel.__init__(self,parent)
panelSizer = wx.GridBagSizer(rowGap,columnGap)
btnSaveProject = wx.Button(parent, label="Save project", size=(100,50))
btnLoadProject = wx.Button(parent, label="Open project", size=(100,50))
panelSizer.Add(btnSaveProject, pos=(0,0), span=(1,1),
flag=wx.EXPAND|wx.LEFT, border = borderWidth)
panelSizer.Add(btnLoadProject, pos=(0,1), span=(1,1),
flag=wx.EXPAND|wx.LEFT, border = borderWidth)
self.SetSizer(panelSizer)
我的主要方法是这样的:
if __name__ == '__main__':
app = wx.App()
Window(None, WindowHeader)
app.MainLoop()
答案 0 :(得分:1)
我不想为您提供完整的解决方案,而是提供有关UI编程的一些建议。
你通过创建许多面板并且从不设置sizer而搞砸了。 在编写UI代码之前始终要考虑要创建的小部件的结构(层次结构)。想想他们的布局。然后记下按地点原则分组的代码:应该在几行中处理大约一层的层次结构。
好,让我们应用这个原则。顶层的笔记本电脑和底部面板:
wx.Frame +- wx.NoteBook +- PageNodesPathsTables +- ... +- BottomGroup
在这个级别,一切都归结为这四个简单的界限:
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.notebook, 2, wx.EXPAND)
sizer.Add(self.bottomPanel, 0)
self.SetSizer(sizer)
显然你知道如何正确处理wx.NoteBook
。非常重要的是对self.SetSizer
的调用(代码中不存在),因为否则框架不知道应该使用哪个sizer来布局其子代。
你要求分区分为两半,非常清楚。智慧之言:不要做比需要更多的筑巢。这可能更具可扩展性(并且可以很容易地推迟),但目前还不需要。如果您这样做:
self.bottomPanel = wx.Panel(mainPanel)
self.bottomGroup = BottomGroup(self.bottomPanel)
您已经引入了至少一个级别(self.bottomPanel
),其中包含一个子级(self.bottomGroup
),它不知道如何布局其子组件。擦除不必要的嵌套,您将摆脱面板创建,sizer创建,sizer分配等。折叠它会让您更快地了解情况。 TODO:
parent
未使用。固定。SSCCE
。