wxPython网格窗口小部件底部和网格边框内部的不需要的空间
Python 3.8 x64 | Windows 10 x64 | wxPython版本4.1.0 我一直在到处寻找答案,但毫无结果。我创建了一个简单的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,但无论行大小更改为什么,问题仍然存在 我在下面包含了一个最小的、可复制
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,由于以下几个原因,不确定您在说什么。首先,我没有控制系统,在Windowswx.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,由于以下几个原因,不确定您在说什么。首先,我没有控制系统,在Windowswx.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中固有的东西。谢谢罗尔夫:)