首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wxPython网格中的自动换行和换行

wxPython网格中的自动换行和换行
EN

Stack Overflow用户
提问于 2011-05-03 10:43:43
回答 2查看 3.6K关注 0票数 4

我想用具有以下行为的单元格来实现网格:

如果

  1. 单元格文本与单元格文本中的
  2. 新品系(\n)不匹配,则应对其进行包装,同时还应处理

也就是说,当您为单元格启用“wrap”选项时,与表格编辑器(如MS、OO等)中的行为相同。

我试着这样做:

代码语言:javascript
复制
import wx 
import wx.grid 

class MyGrid(wx.grid.Grid): 

    def __init__(self, parent = None, style = wx.WANTS_CHARS): 
        wx.grid.Grid.__init__(self, parent, -1, style = style)
        self.CreateGrid(10, 10)
        self.editor = wx.grid.GridCellAutoWrapStringEditor() 
        self.SetDefaultEditor(self.editor)
        self.SetDefaultRenderer(wx.grid.GridCellAutoWrapStringRenderer())
        self.SetCellValue(0, 0, "Line1\nLine2\nLine3") 
        self.SetRowSize(0, 100)

class MyFrame(wx.Frame): 

    def __init__(self, parent = None, title = "Multiline"): 
        wx.Frame.__init__(self, parent, -1, title)
        self.Bind(wx.EVT_CHAR_HOOK, self.on_frame_char_hook)
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL) 
        panel.SetSizer(vbox)
        grid = MyGrid(panel) 
        vbox.Add(grid, 1, wx.EXPAND | wx.ALL, 5) 
        self.grid = grid
        btn_exit = wx.Button(panel, -1, "Exit") 
        vbox.Add(btn_exit, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 10) 

    #Proceed CTRL+ENTER as newline in the cell editor
    def on_frame_char_hook(self, event):
        if event.CmdDown() and event.GetKeyCode() == wx.WXK_RETURN: 
            if self.grid.editor.IsCreated(): 
                self.grid.editor.StartingKey(event) 
            else: 
                event.Skip
        else: 
            event.Skip()

if __name__ == "__main__": 
    app = wx.PySimpleApp() 
    f = MyFrame() 
    f.Center() 
    f.Show() 
    app.MainLoop()

但是这段代码不像预期的那样工作--在单元编辑器中正确地处理换行符,但在单元格呈现器中忽略它。如果删除self.SetDefaultRenderer(wx.grid.GridCellAutoWrapStringRenderer()),那么编辑器和呈现器中的换行符处理都是正确的,但很明显,呈现器中的自动包装不起作用。

有人知道怎么解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-03 21:14:27

通过编写自定义呈现程序解决了这个问题:

代码语言:javascript
复制
from wx.lib import wordwrap
import wx.grid


class CutomGridCellAutoWrapStringRenderer(wx.grid.PyGridCellRenderer):   
    def __init__(self): 
        wx.grid.PyGridCellRenderer.__init__(self)

    def Draw(self, grid, attr, dc, rect, row, col, isSelected):
        text = grid.GetCellValue(row, col)
        dc.SetFont( attr.GetFont() ) 
        text = wordwrap.wordwrap(text, grid.GetColSize(col), dc, breakLongWords = False)
        hAlign, vAlign = attr.GetAlignment()       
        if isSelected: 
            bg = grid.GetSelectionBackground() 
            fg = grid.GetSelectionForeground() 
        else: 
            bg = attr.GetBackgroundColour()
            fg = attr.GetTextColour() 
        dc.SetTextBackground(bg) 
        dc.SetTextForeground(fg)
        dc.SetBrush(wx.Brush(bg, wx.SOLID))
        dc.SetPen(wx.TRANSPARENT_PEN)
        dc.DrawRectangleRect(rect)            
        grid.DrawTextRectangle(dc, text, rect, hAlign, vAlign)

    def GetBestSize(self, grid, attr, dc, row, col): 
        text = grid.GetCellValue(row, col)
        dc.SetFont(attr.GetFont())
        text = wordwrap.wordwrap(text, grid.GetColSize(col), dc, breakLongWords = False)
        w, h, lineHeight = dc.GetMultiLineTextExtent(text)                   
        return wx.Size(w, h)        

    def Clone(self): 
        return CutomGridCellAutoWrapStringRenderer()
票数 3
EN

Stack Overflow用户

发布于 2022-09-30 22:29:45

对于列标题,我能够插入一个\n (换行符)。

代码语言:javascript
复制
self.m_grid1.SetColLabelValue(8, "Reference \n Level")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5868280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档