鱼C论坛

 找回密码
 立即注册
查看: 1823|回复: 4

[已解决]PySimpleGUI报错: couldn't recognize image data

[复制链接]
发表于 2023-7-18 11:01:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求搭救,代码如下:
import PySimpleGUI as sg
import base64

f=open(r'C:\Users\Administrator\Desktop\测试4\3.png','rb')
#读取内容转换为base64编码
is_f=base64.b64decode(f.read())
f.close()

layout=[[sg.B(image_data=is_f,key='-OK-')]]
window=sg.Window('按钮图形',layout,keep_on_top=True)

while True:
    event,values=window.read()
    print(event)

    if event==None:
        break
window.close()

报错提示:Button element error couldn't recognize image data
最佳答案
2023-7-18 11:02:04
在你的代码中,问题出现在图像数据转换的部分。PySimpleGUI 中的  Image  和  Button  元素可以接受  base64  编码的数据,但它们实际上需要的是  base64  编码的 **字符串**,而不是通过  base64.b64decode()  得到的字节数据。在你的代码中,你试图将一个解码的  base64  数据直接传递给  Button  元素,这导致了错误。

此外,你应该使用  base64.b64encode()  而不是  base64.b64decode() ,因为  b64encode()  会将二进制数据编码为  base64  数据,而  b64decode()  是将  base64  数据解码为二进制数据。

下面是修复后的代码:
import PySimpleGUI as sgimport base64# 读取文件并进行 base64 编码with open(r'C:\Users\Administrator\Desktop\测试4\3.png', 'rb') as f:    is_f = base64.b64encode(f.read()).decode('utf-8')layout = [[sg.Button(image_data=is_f, key='-OK-')]]window = sg.Window('按钮图形', layout, keep_on_top=True)while True:    event, values = window.read()    print(event)    if event == None:        breakwindow.close()
在此修复的代码中,我们使用  with open...  结构来读取文件,这是一种更安全的方式,可以确保文件在读取后被正确地关闭。另外,我们使用  base64.b64encode()  对文件内容进行  base64  编码,然后使用  .decode('utf-8')  将字节编码转换为字符串编码,以满足 PySimpleGUI 的需求。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-18 11:01:58 | 显示全部楼层
根据你提供的代码和错误提示,问题可能出在图像的加载上。PySimpleGUI 的 Button 元素可以通过参数 image_data 加载图像数据,但是需要满足一定的条件。

首先,确保图片文件路径是正确的,并且可读取。你可以检查文件路径是否正确,以及确认图片文件存在。

其次,确认你使用的是正确的图像格式。PySimpleGUI 支持常见的图像格式,如 PNG、JPEG 等。请确保你的图片文件是支持的格式,并且没有损坏。

最后,确保将图像数据正确转换为 base64 编码,并传递给 image_data 参数。你的代码中已经使用了 base64.b64decode() 来进行解码,但是需要确认文件的读取和解码过程没有出错。

使用 PySimpleGUI 加载图像的示例代码如下:
import PySimpleGUI as sgimport base64# 读取图片文件并转换为 base64 编码with open(r'C:\Users\Administrator\Desktop\测试4\3.png', 'rb') as f:    image_data = base64.b64encode(f.read())layout = [[sg.B(image_data=image_data, key='-OK-')]]window = sg.Window('按钮图形', layout)while True:    event, values = window.read()    if event == sg.WINDOW_CLOSED:        breakwindow.close()
请确保你的代码中图片文件的路径正确,而且可读取。如果问题仍然存在,请检查图片文件的格式和完整性,以及图像数据转换的过程是否正确。如果问题仍然无法解决,请提供更详细的错误信息以便进行进一步的排查。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-18 11:02:04 | 显示全部楼层    本楼为最佳答案   
在你的代码中,问题出现在图像数据转换的部分。PySimpleGUI 中的  Image  和  Button  元素可以接受  base64  编码的数据,但它们实际上需要的是  base64  编码的 **字符串**,而不是通过  base64.b64decode()  得到的字节数据。在你的代码中,你试图将一个解码的  base64  数据直接传递给  Button  元素,这导致了错误。

此外,你应该使用  base64.b64encode()  而不是  base64.b64decode() ,因为  b64encode()  会将二进制数据编码为  base64  数据,而  b64decode()  是将  base64  数据解码为二进制数据。

下面是修复后的代码:
import PySimpleGUI as sgimport base64# 读取文件并进行 base64 编码with open(r'C:\Users\Administrator\Desktop\测试4\3.png', 'rb') as f:    is_f = base64.b64encode(f.read()).decode('utf-8')layout = [[sg.Button(image_data=is_f, key='-OK-')]]window = sg.Window('按钮图形', layout, keep_on_top=True)while True:    event, values = window.read()    print(event)    if event == None:        breakwindow.close()
在此修复的代码中,我们使用  with open...  结构来读取文件,这是一种更安全的方式,可以确保文件在读取后被正确地关闭。另外,我们使用  base64.b64encode()  对文件内容进行  base64  编码,然后使用  .decode('utf-8')  将字节编码转换为字符串编码,以满足 PySimpleGUI 的需求。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-18 11:25:14 | 显示全部楼层
isdkz 发表于 2023-7-18 11:02
在你的代码中,问题出现在图像数据转换的部分。PySimpleGUI 中的  Image  和  Button  元素可以接受  base6 ...

感谢感谢,原来是我把b64encode看错了,点了b64encode。with open和decode('utf-8')的提醒,谢谢啦!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-18 11:25:47 | 显示全部楼层
陶远航 发表于 2023-7-18 11:01
根据你提供的代码和错误提示,问题可能出在图像的加载上。PySimpleGUI 的 Button 元素可以通过参数 image_d ...

找到问题啦,谢谢~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 11:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表