在wxgrid中使用SetCellValue和WordWrap实现文件列表导入和自动换行

84 阅读2分钟

在使用Wxgrid库将文件列表导入到表格中时,遇到以下问题:

huake_00066_.jpg

  1. 当启用WordWrap功能时,无法将多个文件路径用逗号分隔,以列表形式填充表格的某一列。
  2. 启用WordWrap功能后,无法根据列宽自动调整表格列宽和行高。
  3. 调整主窗口大小时,表格无法随着主窗口大小调整而调整大小。

解决方案:

  1. 为了解决第一个问题,可以使用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)
  1. 为了解决第二个问题,可以监听表格的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)
  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