从sqlite3检索图像并在Kivy图像小部件中显示-ValueError

时间:2018-08-09 04:40:56

标签: python image sqlite kivy kivy-language

要求

我正在尝试从数据库中检索图像并将该图像设置为kivy图像小部件,此操作将引发ValueError,不确定原因。欢迎任何输入。

数据库:Sqlite3

表名:用户

列:UserID,UserName,UserImage

   def populate_fields(self): # NEW
      # Code retrieves text data and display in textinput fields here.

      # STEP 1: RETRIEVE IMAGE
      connection = sqlite3.connect("demo.db")
      with connection:
          cursor = connection.cursor()
          cursor.execute("SELECT UserImage from Users where 
          UserID=?",self.data_items[columns[0]]['text'] )
          image = cursor.fetchone()
          data = io.BytesIO(image[0])

      #STEP 2: SET OUTPUT TO IMAGE WIDGET
          self.image.source = data # ---> triggers an Error

错误跟踪:

self.image.source = data
   File "kivy\weakproxy.pyx", line 33, in kivy.weakproxy.WeakProxy.__setattr__ (kivy\weakproxy.c:1471)
   File "kivy\properties.pyx", line 478, in kivy.properties.Property.__set__ (kivy\properties.c:5572)
   File "kivy\properties.pyx", line 513, in kivy.properties.Property.set (kivy\properties.c:6352)
   File "kivy\properties.pyx", line 504, in kivy.properties.Property.set (kivy\properties.c:6173)
   File "kivy\properties.pyx", line 676, in kivy.properties.StringProperty.check (kivy\properties.c:8613)
 ValueError: Image.source accept only str

2 个答案:

答案 0 :(得分:2)

执行io.BytesIO()后,data以字节为单位。使用Kivy CoreImagetexture来转换data

替换

self.image.source = data

具有:

self.image.texture = CoreImage(data, ext="png").texture

Image source

source
     

图像的文件名/来源。

     

source是StringProperty,默认为None

输出

Img01 Img02

答案 1 :(得分:0)

Ikolim的回答很好,但更具体而言, 如果要将二进制图像直接显示到kivy中,则只需使用io模块(导入io)和kivy图像模块(kivy.uix.image)

检查此代码:

from kivy.uix.image import Image, CoreImage
import io


binary_data= #binary img extracted from sqlite

data = io.BytesIO(binary_data)
img=CoreImage(data, ext="png").texture

new_img= Image()
new_img.texture= img