我想用具有以下行为的单元格来实现网格:
如果
也就是说,当您为单元格启用“wrap”选项时,与表格编辑器(如MS、OO等)中的行为相同。
我试着这样做:
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()),那么编辑器和呈现器中的换行符处理都是正确的,但很明显,呈现器中的自动包装不起作用。
有人知道怎么解决这个问题吗?
发布于 2011-05-03 21:14:27
通过编写自定义呈现程序解决了这个问题:
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()发布于 2022-09-30 22:29:45
对于列标题,我能够插入一个\n (换行符)。
self.m_grid1.SetColLabelValue(8, "Reference \n Level")https://stackoverflow.com/questions/5868280
复制相似问题