如何使文本适合wxPython网格中的单元格?

时间:2014-07-07 11:09:43

标签: python wxpython wxgrid

基本上如果我拖动一个单元格,我可以将它调整到我想要的大小。 wxPython中是否有功能可以自动扩展单元格以适应其中文本的大小?

3 个答案:

答案 0 :(得分:1)

一种方法是捕获任何数据输入到单元格事件中,获取输入数据的大小,检查它是否大于列大小 - >如果是,则将文本宽度设置为列大小。

这是我写的一个示例代码:

import wx.grid
import wx


class Frame ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"Test", pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        sizer_main = wx.BoxSizer( wx.VERTICAL )
        self.panel = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
        sizer_inner = wx.BoxSizer( wx.VERTICAL )
        self.grid = wx.grid.Grid( self.panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0 )

        # Grid
        self.grid.CreateGrid( 5, 5 )
        self.grid.EnableEditing( True )
        self.grid.EnableGridLines( True )
        self.grid.SetGridLineColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_BACKGROUND ) )
        self.grid.EnableDragGridSize( False )
        self.grid.SetMargins( 0, 0 )

        # Columns
        self.grid.EnableDragColMove( False )
        self.grid.EnableDragColSize( True )
        self.grid.SetColLabelSize( 30 )
        self.grid.SetColLabelAlignment( wx.ALIGN_CENTRE, wx.ALIGN_CENTRE )

        # Rows
        self.grid.EnableDragRowSize( True )
        self.grid.SetRowLabelSize( 80 )
        self.grid.SetRowLabelAlignment( wx.ALIGN_CENTRE, wx.ALIGN_CENTRE )

        # Label Appearance

        # Cell Defaults
        self.grid.SetDefaultCellAlignment( wx.ALIGN_LEFT, wx.ALIGN_TOP )
        sizer_inner.Add( self.grid, 1, wx.ALL, 0 )


        self.panel.SetSizer( sizer_inner )
        self.panel.Layout()
        sizer_inner.Fit( self.panel )
        sizer_main.Add( self.panel, 1, wx.EXPAND |wx.ALL, 5 )


        self.SetSizer( sizer_main )
        self.Layout()
        self.Centre( wx.BOTH )
        self.Show()

        # Connect Events
        self.grid.Bind( wx.grid.EVT_GRID_CELL_CHANGE, self.on_edit )

        # Some essential stuff for resizing
        font = wx.Font(pointSize = 10, family = wx.DEFAULT, style = wx.NORMAL, weight = wx.NORMAL, faceName = 'Consolas')
        self.dc = wx.ScreenDC()
        self.dc.SetFont(font)

    def on_edit( self, event ):
        row = event.GetRow()
        col = event.GetCol()
        size = self.dc.GetTextExtent(self.grid.GetCellValue(row, col))
        if size[0] > self.grid.GetColSize(col): self.grid.SetColSize(col, size[0])
        self.panel.Layout()


if __name__ == "__main__":
    app = wx.App()
    Frame(None)
    app.MainLoop()

可能不需要self.panel.Layout()。

答案 1 :(得分:1)

Grid类具有AutoSizeColumn / AutoSizeRowAutoSizeColumns / AutoSizeRows方法,这些方法可以很好地将行或列大小调整为大足够的行或col的内容。然而,对于大型网格来说,它们可能是相当昂贵的操作,所以应该小心使用它们。

答案 2 :(得分:0)

您可以使用wxPython的wordwrap模块或自定义渲染器或两者的组合。这个其他Stack Answer实际上同时使用了两者:

查看wxPython演示中的源代码让我相信你可以用 wordwrap 来实现这一点,因为 GridStdEdRend.py 中的示例只是使用字符串用三引号括起来的。您可能也想看看它。