在使用Wxgrid库将文件列表导入到表格中时,遇到以下问题:
- 当启用WordWrap功能时,无法将多个文件路径用逗号分隔,以列表形式填充表格的某一列。
- 启用WordWrap功能后,无法根据列宽自动调整表格列宽和行高。
- 调整主窗口大小时,表格无法随着主窗口大小调整而调整大小。
解决方案:
- 为了解决第一个问题,可以使用wx.grid.GridCellAttr类来自定义单元格属性,并使用它来设置单元格的换行模式。
class CustomGridCellAttr(wx.grid.GridCellAttr):
def __init__(self, wrap_mode):
wx.grid.GridCellAttr.__init__(self)
self.wrap_mode = wrap_mode
def GetTextAttr(self, attr):
attr.Wrap = self.wrap_mode
然后,在设置单元格值时,使用自定义的单元格属性:
for i in range(self.grid1.GetNumberRows()):
attr = CustomGridCellAttr(wx.grid.WRAP_WORD)
self.grid1.SetCellAttr(i, 1, attr)
self.grid1.SetCellValue(i, 1, forfiles)
- 为了解决第二个问题,可以监听表格的
EVT_GRID_COL_SIZE事件,并在事件处理函数中调整表格列宽和行高。
def OnGridColSize(self, event):
col = event.GetCol()
width = self.grid1.GetColSize(col)
height = self.grid1.GetRowSize(0)
for i in range(self.grid1.GetNumberRows()):
self.grid1.SetRowSize(i, height)
self.grid1.AutoSizeColumn(col, 1)
- 为了解决第三个问题,可以监听表格的
EVT_SIZE事件,并在事件处理函数中调整表格大小。
def OnSize(self, event):
size = event.GetSize()
self.grid1.SetSize(size)
代码示例:
完整的代码示例如下:
import wx
import wx.grid
from wx.lib import wordwrap
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1BUTTON1, wxID_FRAME1BUTTON2, wxID_FRAME1GRID1,
wxID_FRAME1PANEL1,
] = [wx.NewId() for _init_ctrls in range(5)]
class Frame1(wx.Frame):
def _init_ctrls(self, prnt):
# generated method, don't edit
wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,
pos=wx.Point(394, 306), size=wx.Size(835, 372),
style=wx.DEFAULT_FRAME_STYLE, title='Frame1')
self.SetClientSize(wx.Size(819, 334))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1, name='panel1', parent=self,
pos=wx.Point(0, 0), size=wx.Size(819, 334),
style=wx.TAB_TRAVERSAL)
self.button1 = wx.Button(id=wxID_FRAME1BUTTON1,
label='Import to Column A', name='button1', parent=self.panel1,
pos=wx.Point(88, 16), size=wx.Size(152, 23), style=0)
self.button1.Bind(wx.EVT_BUTTON, self.On_Button1_Button,
id=wxID_FRAME1BUTTON1)
self.grid1 = wx.grid.Grid(id=wxID_FRAME1GRID1, name='grid1',
parent=self.panel1, pos=wx.Point(16, 64), size=wx.Size(776, 208),
style=0)
self.grid1.SetAutoLayout(False)
self.grid1.Bind(wx.grid.EVT_GRID_COL_SIZE, self.OnGridColSize)
self.grid1.Bind(wx.EVT_SIZE, self.OnSize)
self.button2 = wx.Button(id=wxID_FRAME1BUTTON2,
label='Import to Column B', name='button2', parent=self.panel1,
pos=wx.Point(25