1

我正在尝试使用本教程中的代码,但结果是一个灰色的单元格,并且单元格中没有图像(参见屏幕截图)。自从我开始寻找将图像添加到网格单元格的解决方案已经有好几天了,我发现这个解决方案是迄今为止最简单的解决方案,但它对我不起作用。拜托,有人可以帮我解决这个问题,以便我可以继续我的项目吗?这将不胜感激。谢谢你。

这是代码:

import wx
import wx.grid
class MyApp(wx.App):
    def OnInit(self):
        frame = wx.Frame(None, -1, title = "wx.Grid - Bitmap example")
        grid = wx.grid.Grid(frame)
        grid.CreateGrid(1,1)
        img = wx.Bitmap(r"E:\Dropbox2\Dropbox\Ubot\Ubot\Python\Magnify\Tkinter Magnify\Tests\python-logo.png", wx.BITMAP_TYPE_PNG)
        imageRenderer = MyImageRenderer(img)
        grid.SetCellRenderer(0,0,imageRenderer)
        grid.SetColSize(0,img.GetWidth()+2)
        grid.SetRowSize(0,img.GetHeight()+2)
        frame.Show(True)
        return True

class MyImageRenderer(wx.grid.PyGridCellRenderer):
    def __init__(self, img):
        wx.grid.PyGridCellRenderer.__init__(self)
        self.img = img
    def Draw(self, grid, attr, dc, rect, row, col, isSelected):

        image = wx.MemoryDC()
        image.SelectObject(self.img)
        dc.SetBackgroundMode(wx.SOLID)
        if isSelected:
            dc.SetBrush(wx.Brush(wx.BLUE, wx.SOLID))
            dc.SetPen(wx.Pen(wx.BLUE, 1, wx.SOLID))
        else:
            dc.SetBrush(wx.Brush(wx.WHITE, wx.SOLID))
            dc.SetPen(wx.Pen(wx.WHITE, 1, wx.SOLID))
        dc.DrawRectangleRect(rect)
        width, height = self.img.GetWidth(), self.img.GetHeight()
        if width > rect.width-2:
            width = rect.width-2
        if height > rect.height-2:
                height = rect.height-2
        dc.Blit(rect.x+1, rect.y+1, width, height, image, 0, 0, wx.COPY, True)

app = MyApp(0)
app.MainLoop()

我得到的结果是:

在此处输入图像描述

您可以使用此图像进行测试:

在此处输入图像描述

4

2 回答 2

2

我不知道您是否在 IDE 中运行它,但如果您在命令行上运行它,您将看到所有警告和错误。IE

wxPyDeprecationWarning: Using deprecated class. Use GridCellRenderer instead.
  wx.grid.PyGridCellRenderer.__init__(self)
Traceback (most recent call last):
  File "20190519.py", line 30, in Draw
    dc.DrawRectangleRect(rect)
AttributeError: 'PaintDC' object has no attribute 'DrawRectangleRect'

针对这些,由于示例陈旧过时,我们可以完全替换PyGridCellRendererGridCellRenderer和转储该dc.DrawRectangleRect(rect)行。如果该功能不存在,请尝试不要使用它,如果不起作用,请寻找替代方法。

编辑:那条线应该是dc.DrawRectangle(rect)

我们最终得到了这个:

import wx
import wx.grid
class MyApp(wx.App):
    def OnInit(self):
        frame = wx.Frame(None, -1, title = "wx.Grid - Bitmap example")
        grid = wx.grid.Grid(frame)
        grid.CreateGrid(2,2)
        img = wx.Bitmap("wxPython.jpg", wx.BITMAP_TYPE_ANY)
        imageRenderer = MyImageRenderer(img)
        grid.SetCellRenderer(0,0,imageRenderer)
        grid.SetColSize(0,img.GetWidth()+2)
        grid.SetRowSize(0,img.GetHeight()+2)
        frame.Show(True)
        return True

class MyImageRenderer(wx.grid.GridCellRenderer):
    def __init__(self, img):
        wx.grid.GridCellRenderer.__init__(self)
        self.img = img
    def Draw(self, grid, attr, dc, rect, row, col, isSelected):
        image = wx.MemoryDC()
        image.SelectObject(self.img)
        dc.SetBackgroundMode(wx.SOLID)
        if isSelected:
            dc.SetBrush(wx.Brush(wx.BLUE, wx.SOLID))
            dc.SetPen(wx.Pen(wx.BLUE, 1, wx.SOLID))
        else:
            dc.SetBrush(wx.Brush(wx.WHITE, wx.SOLID))
            dc.SetPen(wx.Pen(wx.WHITE, 1, wx.SOLID))
        dc.DrawRectangle(rect)
        width, height = self.img.GetWidth(), self.img.GetHeight()
        if width > rect.width-2:
            width = rect.width-2
        if height > rect.height-2:
            height = rect.height-2
        dc.Blit(rect.x+1, rect.y+1, width, height, image, 0, 0, wx.COPY, True)

app = MyApp(0)
app.MainLoop()

这给了我们这个:

在此处输入图像描述

可在此处获取完整的可下载文档:https: //extras.wxpython.org/wxPython4/extras/4.0.4/wxPython-docs-4.0.4.tar.gz 演示在此处:https ://extras。 wxpython.org/wxPython4/extras/4.0.4/wxPython-demo-4.0.4.tar.gz

于 2019-05-19T14:27:35.573 回答
0

如果您收到如下错误,那么您可能setlocale()直接调用而不是 using wxLocale,从而在 C/C++ 和 Windows 语言环境之间造成不匹配。

只能通过创建wxLocale对象来更改语言环境以避免这种情况!

在代码中使用这两行,然后它会正常工作:

import locale

#after created the grid

locale.setlocale(locale.LC_ALL, 'C')
于 2021-02-20T17:59:08.270 回答