从 sqlite3 中检索图像并在 Kivy 图像小部件中显示 - ValueError
Retrieve image from sqlite3 and display in Kivy image widget - ValueError
要求
我正在尝试从数据库中检索图像并将此图像设置为 kivy 图像小部件,此操作抛出 ValueError,不确定原因。欢迎任何意见。
数据库:Sqlite3
Table 姓名:用户
列:用户 ID、用户名、用户图片
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
执行io.BytesIO()
后,data
以字节为单位。使用KivyCoreImage和texture
转换data
.
替换
self.image.source = data
与:
self.image.texture = CoreImage(data, ext="png").texture
source
Filename / source of your image.
source is a StringProperty and defaults to None
输出
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
要求
我正在尝试从数据库中检索图像并将此图像设置为 kivy 图像小部件,此操作抛出 ValueError,不确定原因。欢迎任何意见。
数据库:Sqlite3
Table 姓名:用户
列:用户 ID、用户名、用户图片
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
执行io.BytesIO()
后,data
以字节为单位。使用KivyCoreImage和texture
转换data
.
替换
self.image.source = data
与:
self.image.texture = CoreImage(data, ext="png").texture
source
Filename / source of your image.
source is a StringProperty and defaults to None
输出
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