wx.grid.Grid не загружает изображение - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь использовать код в этом уроке , но в результате получается ячейка серого цвета, а в ней нет изображения (см. Скриншот). Прошло несколько дней с тех пор, как я начал искать решение для добавления изображения в ячейку сетки, и я считаю, что это решение наименее сложное на данный момент, но оно не будет работать для меня. Пожалуйста, кто-нибудь может мне помочь с этой проблемой, чтобы я мог продолжить свой проект? Это будет с благодарностью. Спасибо.

Вот код:

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()

И результат, который я получаю:

enter image description here

Вы можете использовать это изображение для тестов:

enter image description here

1 Ответ

1 голос
/ 19 мая 2019

Я не знаю, запускаете ли вы это в IDE, но если вы запустите его в командной строке, вы увидите все предупреждения и ошибки.то есть

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'

Действуя в соответствии с этим, так как пример старый и устаревший, мы можем заменить PyGridCellRenderer на GridCellRenderer и полностью сбросить строку 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()

Что дает нам это:

enter image description here

Полный комплект загружаемой документации доступен здесь: 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

...