首页 > 解决方案 > wxPython:不能让 GridCellEnumRenderer 工作?

问题描述

我正在尝试为 GridCellEnumRenderer 建立一个工作示例...

看起来这段代码应该可以工作。Grid.SetCellValue() 的(主要)签名是(int,int,str) https://wxpython.org/Phoenix/docs/html/wx.grid.Grid.html#wx.grid.Grid.SetCellValue

我在 12 年前发现了 Robin Dunn 回复的这篇文章: https ://wxpython-users.wxwidgets.narkive.com/GzzT1ip4/gridcellenumrenderer-behavior

似乎基本问题是相同的。我正在使用 grid.CreateGrid(),我理解这基本上意味着我将让网格在幕后处理数据模型本身(而不是定义回调以挂钩到我自己的数据模型中) )。

但是,无论您是否调用 Grid.SetColFormatNumber(),尝试调用 grid.SetCellValue(int, int, int) 都会(不出所料地)抛出错误。

Robin Dunn 对 12 年前这篇文章的回答似乎暗示核心问题是关于你得到的是一个真正的 int 还是一个的字符串表示。但我不是在这里控制内部 - 我唯一的选择似乎是设置字符串值。据我所知,调用 grid.SetColFormatNumber() 似乎只会影响列是左对齐还是右对齐。

如果唯一的选择是使用 str 类型的值调用 grid.SetCellValue(row, col, value),我看不出让 GridCellEnumRenderer 工作的预期是什么?

看起来这应该是一个非常简单、直接、wxPython 新手的任务,但我认为我仍然像 12 年前的 Stuart McGraw 一样困惑。

如何获取配置为从值列表而不是基本 int 值呈现字符串的网格?

或者,换一种说法,有人可以向我展示使用 GridCellEnumRenderer 的标准、普通、简单的新手类型示例吗?(因为我很难通过 Google、wxPython 文档或 Rappin & Dunn 的书中找到它。)

import wx
import wx.grid

GRID_DATA = [
    ['Andrew', 2, 'R006'],
    ['Nandu',  1, 'R007'],
    ['Dave',   3, 'R008'],
    ['John',   2, 'R009'],
]

class GridFrame(wx.Frame):

    def __init__(self, parent, data):
        wx.Frame.__init__(self, parent)

        # Create a wxGrid object
        grid = self.grid = wx.grid.Grid(self, -1)
        grid.CreateGrid(len(data), len(data[0]))

        # set the column headers
        hdrs = ["Who", "Flavor", "myID"]
        for i, hdr in enumerate(hdrs):
            grid.SetColLabelValue(i, hdr)

        # using this only changes 2nd col alignment - rest is same
        grid.SetColFormatNumber(1)

        # populate grid with data
        for r in range(len(data)):
            for c in range(len(data[0])):
                value = data[r][c]
                grid.SetCellValue(r, c, str(value))

        # set Enum-type renderer for second column
        if True:
            flavors = "undef,grape,mango,orange"
            gc_attr = wx.grid.GridCellAttr()
            renderer = wx.grid.GridCellEnumRenderer(choices=flavors)
            gc_attr.SetRenderer(renderer)

            # Rather surprisingly, you can uncomment next two lines and
            # get an Enumerated editor to work pretty much as one might
            # expect. That's pretty awesome, but separate from the basic
            # issue of Enum renderer not working.
            # ed = wx.grid.GridCellEnumEditor(choices=flavors)
            # gc_attr.SetEditor(ed)

            grid.SetColAttr(1, gc_attr)

        self.Show()


if __name__ == '__main__':
    app = wx.App(0)
    frame = GridFrame(None, GRID_DATA)
    app.MainLoop()

标签: pythonuser-interfacedatagridwxpython

解决方案


推荐阅读