python - wxpython wx.Notebook 没有获得任何宽度

标签 python wxpython

我正在尝试使用 wx.Notebook 创建一个项目工具,其顶部有选项卡,底部有一个常规面板。底部面板应独立于笔记本电脑,并且不会在选项卡更改时发生变化。当我只添加笔记本时,笔记本本身工作正常,但是当我还添加底部面板(扩展的 wx.Panel)时,笔记本会被挤压,如图 here 所示。 .

我有一个窗口面板,并将笔记本和底部面板(称为 BottomGroup,扩展 wx.Panel)添加到单独的面板中。谁能发现问题所在吗?也许与尺寸测量器有关?我的窗口是这样的(别介意标签是错误的):

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()

最佳答案

我不想为您提供完整的解决方案,而是想为您提供一些有关 UI 编程的建议。

您因为创建了许多面板却从未设置大小调整器而搞砸了。 在编写 UI 代码之前,请始终考虑要创建的小部件的结构(层次结构)。想想他们的布局。然后写下代码,按局部性原则分组:大约层次结构的一层应在几行内处理。

好,让我们应用一下这个原理。顶层的笔记本和底部面板:

wx.Frame  
 +- wx.NoteBook
     +- PageNodesPathsTables
     +- ...
 +- BottomGroup

At this level, everything comes down to these four, simple lines:

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 分配等操作。折叠它可以让您更快地概览。待办事项:

  • 重写程序的这一部分。去掉多余的说明。
  • 确保每个面板都有尺寸调整器。
  • 用单独的方法重构菜单创建。
  • Window 构造函数中的
  • 参数parent 未使用。修复。
  • 您的示例缺少主方法、导入等。下次,请提供 SSCCE .

关于python - wxpython wx.Notebook 没有获得任何宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14518761/

相关文章:

python - 石头、剪刀、布(python 3.3)

python - 在 TextCtrl 中禁用光标 - wxPython

python - 在默认浏览器中打开wx.html "<a>"标签

Python:具有相同键的几个字典的平均值

python - 为什么 pip 会阻止安装可能不安全和无法验证的文件?

python - Sqlite:无法选择具有大整数 id 的行

python - 在 Electron 应用程序中运行 python 脚本

python - 如何为 python 程序创建自定义 GUI?

c++ - 用于文件同步的简单客户端

python - 我可以在我的项目中嵌入wxPython,从而省去用户安装的麻烦吗?