1

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

4

3 回答 3

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() 可能不需要。

于 2014-07-07T14:28:41.923 回答
1

该类Grid具有AutoSizeColumn/AutoSizeRowAutoSizeColumns/AutoSizeRows方法,它们可以很好地通用地调整行或列的大小,使其足够大以容纳行或列的内容。然而,对于大型电网,它们可能是相当昂贵的操作,因此应谨慎使用。

于 2014-07-07T21:27:13.643 回答
0

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

查看 wxPython 演示中的源代码让我相信您可能只使用自动换行就可以做到这一点,因为 GridStdEdRend.py的示例只是使用用三引号括起来的字符串。你可能也想看看那个。

于 2014-07-07T13:25:31.557 回答