wxPython网格格式

时间:2014-09-25 23:50:25

标签: python grid wxpython

我有一个带有网格的wxPython GUI。在创建网格之前,我无法预测网格的确切大小。我的问题是当用户点击要编辑的单元格时,网格滚动条的显示方式。特别明显的是,网格只有一行,偶尔会发生;如果选择要编辑的单元格,则会弹出滚动条,使您无法看到该行。我不希望用户必须在网格内滚动(在我的GUI中,网格在wx.ScrolledWindow中)。

我需要在网格外面有一些按钮和方向,所以让网格对象“独立”对我来说不是一个好选择。

以下是代码:

class Spacing(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Fix spacing")                                                                                            
        self.panel = wx.ScrolledWindow(self)
        self.InitUI()


    def InitUI(self):
        label = wx.StaticText(self.panel,label="hello")#, size=(500, 50))                                                         
        grid = self.make_table(1, 5)
        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(label, flag=wx.ALL, border=10)
        vbox.Add(grid, flag=wx.BOTTOM|wx.EXPAND, border=20)

        hbox_all= wx.BoxSizer(wx.HORIZONTAL)
        hbox_all.AddSpacer(20)
        hbox_all.AddSpacer(vbox)
        hbox_all.AddSpacer(20)

        self.panel.SetSizer(hbox_all)
        self.panel.SetScrollbars(20, 20, 50, 50)
        hbox_all.Fit(self)
        self.Show()


    def make_table(self, n_cols, n_rows):
        grid = wx.grid.Grid(self.panel, -1)
        grid.ClearGrid()
        grid.CreateGrid(n_cols, n_rows)
        for n in range(n_cols):
            for num in range(n_rows):
                grid.SetCellValue(n, num, (str(num) + str(n)))
        return grid

if __name__ == "__main__":
    app = wx.PySimpleApp()
    app.frame = Spacing()
    app.frame.Show()
    app.frame.Center()
    app.MainLoop()

我可以想象一些选择。一,如果我可以在网格窗口中添加一些“填充”,用户仍然可以看到他们正在编辑的内容,无论如何。二,如果我可以覆盖网格的滚动窗口性质,那也可以。我没想到  如何做其中任何一个,我愿意接受其他建议。我已经尝试搞乱禁用grid.SetAutoLayout并手动调整网格大小,但这些都没有证明有效。我真的很感激任何建议!

我设计的(非常)hack-y解决方案是确保容器窗口中的另一个窗口小于网格,并将网格设置为wx.EXPAND,这可以防止水平滚动条从来弹出。

也就是说,我替换了这行代码:

    label = wx.StaticText(self.panel,label="hello")

用这个:

    label = wx.StaticText(self.panel,label="hello", size=(500, 50))  

和这一行:

    vbox.Add(grid, flag=wx.BOTTOM, border=20)

用这个:

    vbox.Add(grid, flag=wx.BOTTOM|wx.EXPAND, border=20)

此选项看起来有点奇怪,但它不会模糊用户输入的内容。显然这不是一个好的解决方案,但我无法弄清楚如何实际解决问题。

更新

如果我使用设定的间距创建网格,则不会重新调整大小:

    grid = wx.grid.Grid(self.panel, -1, size = (500, 300))

但是如果我创建网格然后尝试重新调整它的大小,它就不会“坚持”并且我有与以前相同的令人反感的行为。事实上,grid.SetSize看起来似乎并没有在视觉上工作,即使我调用grid.GetSize()它报告的是我指定的大小。

    grid.SetSize(wx.Size(500, 300))

0 个答案:

没有答案