Не удается отобразить изображение большого двоичного объекта в BitmapButton python

#python #sqlite #wxpython

#python #sqlite #wxpython

Вопрос:

Мой класс

 class Mydb():
    def __init__ (self):
        self.conn = sqlite3.connect('C:\lab\pictures.db')

    def queryf(self,q):
        c = self.conn.cursor()
        c.execute(q)
        data = c.fetchone()
        return data[0]
  

Использование класса Mydb

 ....
q = "SELECT file FROM t_pictures WHERE id = 1;"
db = Mydb()
_data = db.queryf(q)
start_image = wx.Image(_data)
start_image.Rescale(150, 100)
image = wx.BitmapFromImage(start_image)
self.bitmap_button_1 = wx.BitmapButton(self, wx.ID_ANY,image)  
  

Ошибка

 TypeError: String or Unicode type required
  

Комментарии:

1. с помощью open(«c:\lab\ai.jpg «, «wb») в качестве выходного файла: q = «ВЫБЕРИТЕ файл ИЗ t_pictures, ГДЕ id = 1;» db = Mydb() _data = db.queryf(q) output_file. запись (_data)

Ответ №1:

 def Onbutton_1(self,event):
    q = "SELECT file FROM t_pictures WHERE id = 1;"
    db = Mydb()
    _buffer = db.queryf(q)
    stream = cStringIO.StringIO(_buffer)
    image = wx.ImageFromStream(stream)        
    _pic = wx.BitmapFromImage(image.Rescale(150, 100))        
    self.bitmap_button_1 = wx.BitmapButton(self, wx.BITMAP_TYPE_ANY,_pic)
  

Ответ №2:

База данных не возвращает строку из этого запроса. Вам нужно выяснить, какой тип объекта он возвращает. Я предполагаю, что вы получаете кортеж. В этом случае извлеките строку из кортежа и попробуйте поместить ее в свой виджет изображения. Также убедитесь, что вы передаете wx.BITMAP_TYPE_ANY в качестве второго параметра в wx.Image, чтобы сделать виджет более гибким. См. http://www.wxpython.org/docs/api/wx.Image-class.html для получения более подробной информации.

Комментарии:

1. Когда я использую тот же запрос def для загрузки изображения, он работает пример: с open(«c:\lab\ai.jpg «, «wb») в качестве выходного файла: q = «ВЫБЕРИТЕ файл ИЗ t_pictures, ГДЕ id = 1;» db = Mydb() _data = db.queryf(q) output_file. запись (_data) Я попытался изменить 2-й параметр на wx.BITMAP_TYPE_ANY.

2. Введите тип печати (_data) и посмотрите, что вы получите.

3. Результат <тип ‘buffer’>

4. Это ваша проблема. Запрос возвращает объект буфера, а не строку.

5. Вот почему я присоединяюсь к Stack overflow, потому что у меня проблема, которая требует решения. Для меня более полезно дать мне правильный и рабочий код.