geekdoc-python-zh/docs/pythonlibrary/wxpython-changing-custom-re...

3.2 KiB
Raw Permalink Blame History

wxPython:更改列/行的自定义渲染器

原文:https://www.blog.pythonlibrary.org/2019/01/03/wxpython-changing-custom-renderers-for-columns-rows/

wxPython GUI toolkit 有一个非常丰富和强大的网格小部件,我在之前的博客中已经提到过。它允许您创建类似于 Microsoft Excel 中的单元格表。

还有一个简洁的 mixin允许您将定制的渲染器应用到网格的列和行的标签上。

让我们来看看它是如何工作的:


import wx
import wx.grid as grid
import wx.lib.mixins.gridlabelrenderer as glr

class MyGrid(grid.Grid, glr.GridWithLabelRenderersMixin):

    def __init__(self, *args, **kw):
        grid.Grid.__init__(self, *args, **kw)
        glr.GridWithLabelRenderersMixin.__init__(self)

class MyColLabelRenderer(glr.GridLabelRenderer):

    def __init__(self, bgcolor):
        self._bgcolor = bgcolor

    def Draw(self, grid, dc, rect, col):
        dc.SetBrush(wx.Brush(self._bgcolor))
        dc.SetPen(wx.TRANSPARENT_PEN)
        dc.DrawRectangle(rect)
        hAlign, vAlign = grid.GetColLabelAlignment()
        text = grid.GetColLabelValue(col)
        self.DrawBorder(grid, dc, rect)
        self.DrawText(grid, dc, rect, text, hAlign, vAlign)

class MyPanel(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        grid = MyGrid(self, size=(100, 100))
        grid.CreateGrid(numRows=10, numCols=10)

        for col in range(0, 10, 3):
            grid.SetColLabelRenderer(
                col+0, MyColLabelRenderer('#e0ffe0'))
            grid.SetColLabelRenderer(
                col+1, MyColLabelRenderer('#e0e0ff'))
            grid.SetColLabelRenderer(
                col+2, MyColLabelRenderer('#ffe0e0'))

        main_sizer = wx.BoxSizer(wx.VERTICAL)
        main_sizer.Add(grid, 1, wx.EXPAND)
        self.SetSizer(main_sizer)

class MyFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, title='Custom Grid Renderers')
        panel = MyPanel(self)
        self.Show()

if __name__ == '__main__':
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop(

让我们把它分解一下。您会注意到在代码的顶部,我们需要在 wxPython 中单独导入网格小部件。我们还需要导入一个名为的 mixin。我们子类化 Grid 类,添加 mixin然后初始化两者。

接下来我们创建一个gridlabellerenderer的子类,它也来自 mixin。这允许我们创建一个间距绘制方法,这将使我们能够在网格中的标签上应用不同的颜色或字体。在这种情况下,我只是让我们可以改变标签中文本的颜色。

我们感兴趣的最后一段代码是在 MyPanel 类中,我们实际上实例化了网格并改变了列中标签的背景颜色。这是网格最终的样子:

wxPython Grid widget with colored columns

Custom Grid Column Renderers

包扎

wxPython 工具包有几十个预构建的小部件可以用来创建跨平台的用户界面。wxPython 演示有一个比本文更复杂的例子,您可能也会感兴趣。如果您还没有尝试过 wxPython那么您真的应该去尝试一下。它可以从 PyPI 进行 pip 安装,并且与 Python 3 兼容。