【问题标题】:WxWidgets panels in sizers don't seem to be workingsizer 中的 WxWidgets 面板似乎无法正常工作
【发布时间】:2020-01-13 20:30:15
【问题描述】:

我有一个像这样设置的 WxWidgets 项目:

Main Frame->Main Panel->Vertical Sizer
  ->Horizontal Sizer for a few buttons etc
  ->Horizontal Sizer that shows all the main info.
      ->In that main sizer, I have a SimpleBook
           ->The Simple book has 3 panels in it.

无论如何,SimpleBook 的可见页面在顶部的“几个按钮”大小调整器下方。

当在 sizer 中有面板时,面板是否遵守 sizer 在窗口中的位置?

当 SimpleBook 是 Sizer 时,这看起来很“完美”。但我正在尝试修复this stackoverflow question.中的错误

编辑:添加简单代码。这里的任何错误等都只是复制/粘贴错误。代码编译得很好。在这里很难找到要复制的所有相关部分。

type ControlWindow struct {
    wx.Frame
    panel                wx.Panel
    gamePanel            wx.Panel
    editProfilePanel     wx.Panel
    newProfilePanel      wx.Panel
    mainBook             wx.Simplebook
    profileChoice        ControlChoice
    platformChoice       ControlChoice
    vSizerEditProfile    wx.BoxSizer
    vSizerNewProfile     wx.BoxSizer
    gridSizerEditProfile wx.FlexGridSizer
    vSizerMainArea       wx.BoxSizer
    vSizerGameGrid       wx.BoxSizer
    statusbar            wx.StatusBar
    toolbar              wx.ToolBar
    menubar              wx.MenuBar
    hSizerSearch         wx.BoxSizer
    nextResults          wx.Button
    prevResults          wx.Button
    auiManager           wx.AuiManager
}
func MainWindow() ControlWindow {

    getPlatforms()
    w := ControlWindow{}
    w.Frame = wx.NewFrame(wx.NullWindow, -1, title", wx.DefaultPosition, wx.NewSizeT(800, 600))

    mainSizer := wx.NewBoxSizer(wx.VERTICAL)
    w.panel = wx.NewPanel(w, wx.ID_ANY)
    w.mainBook = wx.NewSimplebook(w.panel, wx.ID_ANY)

    blankPanel := wx.NewPanel(w, wx.ID_ANY)

    w.gamePanel = wx.NewPanel(w.panel, wx.ID_ANY)
    w.GameGrid = wx.NewGrid(w.gamePanel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.EXPAND|wx.ALL)
    w.vSizerGameGrid = wx.NewBoxSizer(wx.VERTICAL)
    w.vSizerGameGrid.Add(w.GameGrid)

    w.editProfilePanel = wx.NewPanel(w.panel, wx.ID_ANY)
    w.newProfilePanel = wx.NewPanel(w.panel, wx.ID_ANY)
    w.vSizerNewProfile = wx.NewBoxSizer(wx.VERTICAL)

    vSizer := wx.NewBoxSizer(wx.VERTICAL)
    hSizerLoad := wx.NewBoxSizer(wx.HORIZONTAL)
    w.hSizerSearch = wx.NewBoxSizer(wx.HORIZONTAL)
    w.vSizerMainArea = wx.NewBoxSizer(wx.HORIZONTAL)
    w.vSizerEditProfile = wx.NewBoxSizer(wx.VERTICAL)
    w.gridSizerEditProfile = wx.NewFlexGridSizer(3, 3, 7)

    hSizerLoad.Add(w.platformChoice.Choice)
    hSizerLoad.Add(w.profileChoice.Choice)
    hSizerLoad.Add(profileEditButton)
    hSizerLoad.Add(newProfileButton)

    w.hSizerSearch.Add(searchInput)
    w.hSizerSearch.Add(searchBy)
    w.hSizerSearch.Add(searchButton)
    w.hSizerSearch.Add(resetSearch)
    w.hSizerSearch.Add(perPage)
    w.hSizerSearch.Add(w.prevResults, 0, wx.ALIGN_BOTTOM)
    w.hSizerSearch.Add(w.totalGamesLabel, 0, wx.ALIGN_BOTTOM)
    w.hSizerSearch.Add(w.nextResults, 0, wx.ALIGN_BOTTOM)

    //Just so I can see where the panel actually is.
    blankPanel.SetBackgroundColour(wx.GetBLUE())
    w.mainBook.AddPage(blankPanel, "Blank Panel", true)
    w.mainBook.AddPage(w.gamePanel, "Game Panel Text", false)
    w.mainBook.AddPage(w.editProfilePanel, "Edit Profile Panel Text", false)
    w.mainBook.AddPage(w.newProfilePanel, "New Profile Panel Text", false)
    w.vSizerMainArea.Add(w.mainBook, 1, wx.EXPAND|wx.ALL)
    w.vSizerMainArea.Layout()

    /*This is what I had before but it left artifacts when hiding and showing sizers.
    **So that's why I'm trying to use simplebook...
    *   w.vSizerMainArea.Add(w.vSizerGameGrid, 1, wx.EXPAND|wx.ALL, 5)
    *   w.vSizerMainArea.Add(w.vSizerNewProfile, 1, wx.EXPAND|wx.ALL, 5)
    *   w.vSizerMainArea.Add(w.vSizerEditProfile, 1, wx.EXPAND|wx.ALL, 5)
    *   w.vSizerMainArea.Hide(w.vSizerGameGrid, false)
    *   w.vSizerMainArea.Hide(w.vSizerNewProfile, false)
    *   w.vSizerMainArea.Hide(w.vSizerEditProfile, false)
    */

    hSizerRunButtons.Add(SaveProfileGameChanges, 0, wx.ALIGN_BOTTOM)
    hSizerRunButtons.Add(RunButton, 0, wx.ALIGN_BOTTOM)
    vSizer.Add(hSizerLoad, 0, wx.EXPAND|wx.ALL, 5)
    vSizer.Add(w.hSizerSearch, 0, wx.EXPAND|wx.ALL, 5)
    vSizer.Add(w.vSizerMainArea, 3, wx.EXPAND|wx.ALL, 5)
    vSizer.Add(hSizerRunButtons, 0, wx.EXPAND|wx.ALL, 5)
    w.panel.SetSizer(vSizer)
    mainSizer.Add(w.panel, 1, wx.ALL|wx.EXPAND, 5)
    w.SetSizer(mainSizer)
    return w
}

【问题讨论】:

  • 我会把代码示例放在这里,但实际上是 1000 行。
  • 简单书页的父级是什么?
  • 简单书的父级是主面板。所以:Frame->Panel->Sizer->SimpleBook->Panel->Sizer->控制对象
  • 不是简单的书——它是一页。构造函数中传递了什么参数?另外 - 你不必把整个代码 - 只是构造函数和布局代码。
  • sizer that shows all the main info.,这是做什么的?

标签: wxpython wxwidgets


【解决方案1】:

您必须创建 wxSimplebook 页面,将 book 控件本身作为父级,而不是完全不同的窗口。

【讨论】:

  • 啊。所以,作为一个例子,它应该是: w.gamePanel = wx.NewPanel(w.mainBook, wx.ID_ANY) ?
  • 我今晚应该可以测试了。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2017-09-04
  • 2012-05-06
  • 2013-02-17
  • 2017-10-09
  • 2017-08-03
  • 2014-05-02
  • 2011-09-11
  • 2016-02-11
相关资源
最近更新 更多