【问题标题】:wx.Grid and ScrolledWindowswx.Grid 和 ScrolledWindows
【发布时间】:2018-12-06 18:39:00
【问题描述】:

我正在创建一个通过 wx.grid 显示大量数据的 WX Widgets 应用程序。

我实际上在使用 WX.Go。

无论我做什么,网格都不会在滚动窗口内,甚至会越过状态栏。

我想要做的就是将 Grid 放在可滚动的窗口/面板中。

w := ControlWindow{}
    w.Frame = wx.NewFrame(wx.NullWindow, -1, "FooBar", wx.DefaultPosition, wx.NewSizeT(600, 400))
    w.statusbar = w.CreateStatusBar()
    w.statusbar.SetStatusText("Welcome to FooBar")
    w.SetBackgroundColour(wx.GetBLACK())
    scroller := wx.NewScrolledWindow(w, wx.ID_ANY)
    scroller.SetScrollbar(wx.VERTICAL, 1, 1, 1)
    scroller.SetBackgroundColour(wx.GetGREEN())
    w.menubar = wx.NewMenuBar()
    menuFile := wx.NewMenu()
    menuFile.Append(wx.ID_EXIT)
    wx.Bind(w, wx.EVT_MENU, func(e wx.Event) {
        w.Close(true)
    }, wx.ID_EXIT)
    w.menubar.Append(menuFile, "&File")
    w.SetMenuBar(w.menubar)
    vSizer := wx.NewBoxSizer(wx.VERTICAL)



    /*add system choices */
    filesFolder := strings.Join([]string{ThisFolder, "systems"}, Slash)
    err := filepath.Walk(filesFolder, func(path string, info os.FileInfo, err error) error {
        SystemFiles = append(SystemFiles, path)
        return nil
    })
    if err != nil {
        checkErr(err)
    }

    for _, file := range SystemFiles {
        if !FileExists(file) {
            continue
        }

        xmlFile, err := os.Open(file)
        checkErr(err)
        decoder := xml.NewDecoder(xmlFile)
...loop through to create SystemsAutoComplete = append(SystemsAutoComplete, attribute.Value) which is a []string

sort.Strings(SystemsAutoComplete)
    systemsGrid := wx.NewGrid(w, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize)
    systemsGrid.CreateGrid(0, 3)
    for _, stemp := range SystemsAutoComplete {

        systemsGrid.AppendRows(1)
        renderer := wx.NewGridCellBoolRenderer()
        systemsGrid.SetCellRenderer(systemsGrid.GetNumberRows()-1, 0, renderer)
        editor := wx.NewGridCellBoolEditor()
        systemsGrid.SetCellEditor(systemsGrid.GetNumberRows()-1, 0, editor)
        systemsGrid.SetCellValue(systemsGrid.GetNumberRows()-1, 2, stemp)
        systemsGrid.SetReadOnly(systemsGrid.GetNumberRows()-1, 2, true)
        systemsGrid.AutoSizeColumns(true)
}
vSizer.Add(systemsGrid,1,wx.EXPAND,5)
    scroller.SetSizer(vSizer)
    scroller.FitInside()
    return w

我已经尽可能地简化了代码。我仍然得到相同的结果。

package main

import (
    "github.com/dontpanic92/wxGo/wx"
)

type ControlWindow struct {
    wx.Frame
    statusbar  wx.StatusBar
    toolbar    wx.ToolBar
    menubar    wx.MenuBar
    auiManager wx.AuiManager
}

func main() {
    wx1 := wx.NewApp()
    w := ControlWindow{}
    w.Frame = wx.NewFrame(wx.NullWindow, -1, "FooBar", wx.DefaultPosition, wx.NewSizeT(600, 400))
    w.SetBackgroundColour(wx.GetBLACK())
    scroller := wx.NewScrolledWindow(w, wx.ID_ANY)
    scroller.SetScrollbar(wx.VERTICAL, 1, 1, 1)
    scroller.SetBackgroundColour(wx.GetGREEN())
    vSizer := wx.NewBoxSizer(wx.VERTICAL)
    grid := wx.NewGrid(scroller, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize)
    grid.CreateGrid(60, 1)
    vSizer.Add(grid, 1, wx.EXPAND, 5)
    scroller.SetSizer(vSizer)
    scroller.SetAutoLayout(true)
    scroller.Layout()
    scroller.Fit()
    scroller.SetScrollbar(0, 16, 50, 15)
    w.Show()
    wx1.MainLoop()
    w.Destroy()
    return
}

【问题讨论】:

  • 为什么要双滚动窗口? wxGrid 根据定义是可滚动的。如果你放置大量数据,它会显示滚动条。
  • 那为什么不加滚动条呢?
  • 您是否尝试简单地将网格添加到面板而不是 wxSWcrollWindow?你能发布一些代码吗?如果项目数超过屏幕大小,我很难相信它不会显示滚动条......
  • 简化并复制完整代码。
  • 您在网格中添加了多少项?此外,你应该有这样的:框架->(sizer)->面板->(sizer)->网格。任何地方都没有滚动条。箭头表示父/子关系。

标签: wxwidgets wxgrid wxgo


【解决方案1】:

我真的看不懂 Go,但如果我理解正确的话,你会有一些根本性的缺陷:

  • 父子关系看起来不对:如果要将systemsGrid 添加到将设置为scroller 的sizer,那么systemsGrid 必须有scroller 作为父级。是吗?
  • gridscrollersystemsGrid 是否都具有相同的父级?因为如果他们这样做了,即使您将其更改为systemsGrid,您仍然需要对其余两个做一些事情:删除显然无用的grid 或将它们都放入您需要设置的尺寸器中交给他们的父母或手动处理他们的职位(这是最不明智的做法)。

【讨论】:

  • @Chemdream 我同意@catalin。你的systemsGridw(一个wxFrame)作为它的父级。 scroller 也一样。所以他们将共享 wxFrame 的客户端部分。您正在将vSizer 设置为布局scroller 窗口,但是将网格添加到这个sizer。错误的。一个sizer 布局共享同一个父窗口的窗口。换句话说,vSizer只能布局scroller的子元素,而网格不是它的子元素。
  • 这可能是 WxGo 的问题。当滚动窗口是网格的父级时,框架永远不会打开。我需要终止进程。如果框架是网格的父级,则它可以正常打开。我会在整理时更新它
  • 我对其进行了简化并复制了完整的代码。得到相同的结果。
猜你喜欢
  • 1970-01-01
  • 2012-12-22
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多