如何在Tkinter标签中使用base64编码的图像字符串?

时间:2017-02-11 10:51:33

标签: python image tkinter base64 pyinstaller

我正在编写一个tkinter程序,它利用一些JPG文件作为其背景。但是,我发现当使用" pyinstaller"将脚本转换为.exe文件时,用于tkinter窗口的图像不会编译/添加到.exe文件中。

因此,我决定在Python脚本中对图像进行硬编码,以便不存在外部依赖性。为此,我做了以下事情:

import base64
base64_encodedString= ''' b'hAnNH65gHSJ ......(continues...) '''
datas= base64.b64decode(base64_encodedString)

上述代码用于解码基础64编码的图像数据。 我想使用这个解码的图像数据作为图片并在tkinter中显示为标签/按钮。

例如:

from tkinter import *
root=Tk()
l=Label(root,image=image=PhotoImage(data=datas)).pack()
root.mainloop()

但是,tkinter不接受存储在data中的值以用作图像。 它显示以下错误 -

Traceback (most recent call last):
  File "test.py", line 23, in <module>
    l=Label(root,image=PhotoImage(data=datas))
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 3394, in __init__

    Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 3350, in __init__
    self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: couldn't recognize image data

2 个答案:

答案 0 :(得分:4)

Tkinter PhotoImage类(在Python 3中使用tk 8.6)只能读取GIF,PGM / PPM和PNG图像格式。有两种方法可以读取图像:

  • 来自档案:PhotoImage(file="path/to/image.png")
  • 来自base64编码的字符串:PhotoImage(data=image_data_base64_encoded_string)

首先,如果要将图像转换为base64编码的字符串:

import base64

with open("path/to/image.png", "rb") as image_file:
    image_data_base64_encoded_string = base64.b64encode(image_file.read()) 

然后在Tkinter中使用它:

import tkinter as tk

root = tk.Tk()

im = PhotoImage(data=image_data_base64_encoded_string)

tk.Label(root, image=im).pack()

root.mainloop()

我认为您的问题是您在使用datas= base64.b64decode(base64_encodedString)之前使用PhotoImage对字符串进行了解码,而您应该直接使用base64_encodedString

答案 1 :(得分:0)

只需更正j_4321的正确答案,PhotoImage的正确行是:

im = tk.PhotoImage(data=image_data_base64_encoded_string)

以及我编写“ image”字符串以便在之后导入的解决方案:

with open("image.py", "wb") as fichier:
    fichier.write(b'imageData=b\'' + image_data_base64_encoded_string + b'\'')

一个简单的import image as img和图像数据将通过Pyinstaller(-F选项)存储在.exe文件中。