wxPython网格窗口小部件底部和网格边框内部的不需要的空间

wxPython网格窗口小部件底部和网格边框内部的不需要的空间,python,gridview,grid,wxpython,Python,Gridview,Grid,Wxpython,Python 3.8 x64 | Windows 10 x64 | wxPython版本4.1.0 我一直在到处寻找答案,但毫无结果。我创建了一个简单的wx.grid.grid()小部件,并在网格周围添加了一个边框。问题是在网格小部件和它的边界之间有死区。我不是在描述边界外的空间,它是使用尺寸标注器添加的。我选择的边框是wx.border\u主题,我不想更改它,因为我的GUI的其余部分使用相同的边框。我确实将行大小设置为20,但无论行大小更改为什么,问题仍然存在 我在下面包含了一个最小的、可复制

Python 3.8 x64 | Windows 10 x64 | wxPython版本4.1.0

我一直在到处寻找答案,但毫无结果。我创建了一个简单的
wx.grid.grid()
小部件,并在网格周围添加了一个边框。问题是在网格小部件和它的边界之间有死区。我不是在描述边界外的空间,它是使用尺寸标注器添加的。我选择的边框是
wx.border\u主题
,我不想更改它,因为我的GUI的其余部分使用相同的边框。我确实将行大小设置为20,但无论行大小更改为什么,问题仍然存在

我在下面包含了一个最小的、可复制的代码示例。乍一看似乎很多,但事实并非如此,而且非常基本

还附上一张图片,说明我试图描述上述内容。所附照片中的底线是边框,上线是网格。


最小代码示例:

import wx
import wx.grid


class MyGrid(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='Grid With Undesirable Space', size=(650, 300))
        self.SetMinSize(self.GetSize())  # set min size of frame
        self.rows, self.columns = 1, 4

        panel = wx.Panel(self)

        self.grid = wx.grid.Grid(panel, style=wx.BORDER_THEME)
        self.grid.CreateGrid(self.rows, self.columns)
        self.grid.ShowScrollbars(wx.SHOW_SB_NEVER, wx.SHOW_SB_NEVER)  # remove scroll bars

        # set all cells in first row Read Only
        attr = wx.grid.GridCellAttr()
        attr.SetReadOnly(True)
        self.grid.SetRowAttr(0, attr)

        self.grid.HideRowLabels()
        self.grid.SetRowSize(0, 20)
        self.grid.DisableDragRowSize()

        self.grid.SetColLabelSize(20)

        self.grid.SetColLabelValue(0, 'Nintendo')
        self.grid.SetColLabelValue(1, 'Super Nintendo')
        self.grid.SetColLabelValue(2, 'Nintendo 64')
        self.grid.SetColLabelValue(3, 'Nintendo GameCube')

        v_box = wx.BoxSizer(wx.VERTICAL)
        v_box.Add(self.grid, proportion=0, flag=wx.ALL | wx.EXPAND, border=10)
        panel.SetSizer(v_box)
        self.Layout()

        # set the initial size of columns based on initial frame size
        self.resize_with_frame()

        self.grid.Bind(wx.EVT_SIZE, lambda event: self.resize_with_frame())

    def resize_with_frame(self):
        """Dynamically resize columns with the size of the frame."""
        width, height = self.GetClientSize()
        for column in range(self.columns):
            self.grid.SetColSize(column, (width - 20) / self.columns)  # width - 20 for border of 10 on both sides
            

if __name__ == "__main__":
    app = wx.App()
    gui = MyGrid()
    gui.Show()
    app.MainLoop()


不幸的是,您正在将控制权移交给系统,因此系统将决定边界。使用
wx.BORDER\u DEFAULT
wx.BORDER\u NONE
应将其删除。注释是明确的
,通常,指定wxBORDER_主题将导致使用某种边界,由平台和控件类选择。要将边界决策完全交给wxWidgets,请传递wxBORDER_DEFAULT。
@RolfofSaxony,由于以下几个原因,不确定您在说什么。首先,我没有控制系统,在Windows
wx.BORDER\u THEME
上,与
wx.BORDER\u DEFAULT
相同,我只是想明确,所以我选择了
wx.BORDER\u THEME
。您可以自己使用
wx.BORDER\u DEFAULT
进行尝试,但没有任何更改。其次,如前所述,我正在使用
wx.BORDER\u主题
来处理我所有其他没有这个问题的小部件。同样,这告诉我grid小部件发生了一些事情,而这与边框本身无关……我要更正,这两个边框之间存在差异。为什么使用
wx.BORDER\u主题
不会给我正在使用的20个其他小部件带来任何问题?我仍然相信在
wx.BORDER\u THEME
和网格小部件之间发生了一些奇怪的事情。你很可能是对的,在这种情况下,报告它是一个bug,但我怀疑它是在wxWidgets级别,而不是wxPython。我很高兴我错了。谢谢你花时间帮忙。我会将此报告为一个bug,并查看它的去向,但我怀疑您是对的,它可能是wxWidgets中固有的东西。谢谢罗尔夫:)不幸的是,你把控制权交给了系统,所以它决定边界。使用
wx.BORDER\u DEFAULT
wx.BORDER\u NONE
应将其删除。注释是明确的
,通常,指定wxBORDER_主题将导致使用某种边界,由平台和控件类选择。要将边界决策完全交给wxWidgets,请传递wxBORDER_DEFAULT。
@RolfofSaxony,由于以下几个原因,不确定您在说什么。首先,我没有控制系统,在Windows
wx.BORDER\u THEME
上,与
wx.BORDER\u DEFAULT
相同,我只是想明确,所以我选择了
wx.BORDER\u THEME
。您可以自己使用
wx.BORDER\u DEFAULT
进行尝试,但没有任何更改。其次,如前所述,我正在使用
wx.BORDER\u主题
来处理我所有其他没有这个问题的小部件。同样,这告诉我grid小部件发生了一些事情,而这与边框本身无关……我要更正,这两个边框之间存在差异。为什么使用
wx.BORDER\u主题
不会给我正在使用的20个其他小部件带来任何问题?我仍然相信在
wx.BORDER\u THEME
和网格小部件之间发生了一些奇怪的事情。你很可能是对的,在这种情况下,报告它是一个bug,但我怀疑它是在wxWidgets级别,而不是wxPython。我很高兴我错了。谢谢你花时间帮忙。我会将此报告为一个bug,并查看它的去向,但我怀疑您是对的,它可能是wxWidgets中固有的东西。谢谢罗尔夫:)