Base64字符串到tkinter

时间:2017-03-16 12:53:00

标签: python string tkinter base64 encode

我有一个我在GUI中使用的图像,当我编译.exe或我的.py时,我不希望它作为外部资源。 我想我应该把它编码成一个字符串,复制代码中的字符串并解码它并将其提供给Tkinter。尝试了一堆解决方案,但仍然无法工作,这是代码:

import tkinter as tk
from tkinter import filedialog
from tkinter import *
import PIL
from PIL import Image, ImageTk
import base64


stringimagine="something the print gave me"


imagine=open('logo.jpg','rb')
encoded=base64.b64encode(imagine.read())
print(encoded)
imagine2=base64.b64decode(stringimagine)


fereastra_principala = tk.Tk()



poza=Label(fereastra_principala,image=imagine2)
poza.pack(fill='both',expand='yes')

fereastra_principala.mainloop()

到此代码我收到此错误:

File "C:\Python34\lib\tkinter\__init__.py", line 2609, in __init__ Widget.__init__(self, master, 'label', cnf, kw)
File "C:\Python34\lib\tkinter\__init__.py", line 2127, in __init__ (widgetName, self._w) + extra + self._options(cnf))_tkinter.TclError

这就是我现在用来获取照片的方式,作为外部资源:

img=Image.open('logo.jpg')
image=ImageTk.PhotoImage(img)
poza=Label(fereastra_principala,image=image)
poza.pack()

2 个答案:

答案 0 :(得分:0)

如果您有base64编码的数据,则需要使用data参数。但是,我认为这不适用于jpg。它虽然适用于.gif图像。

这是canonical documentation对数据选项所说的内容:

  

以图像形式指定图像的内容。该字符串应包含二进制数据,或者对于某些格式,包含base64编码的数据(目前保证GIF图像支持此数据)。字符串的格式必须是具有将接受字符串数据的图像文件格式处理程序的格式之一。如果同时指定了-data和-file选项,则-file选项优先。

实施例

import Tkinter as tk

IMAGE_DATA = '''
    R0lGODlhEAAQALMAAAAAAP//AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAA\nAAAAACH5BAEAAAIALAAAAAAQABAAQAQ3UMgpAKC4hm13uJnWgR
    TgceZJllw4pd2Xpagq0WfeYrD7\n2i5Yb+aJyVhFHAmnazE/z4tlSq0KIgA7\n
'''

root = tk.Tk()
image = tk.PhotoImage(data=IMAGE_DATA)
label = tk.Label(root, image=image, padx=20, pady=20)
label.pack()

root.mainloop()

答案 1 :(得分:0)

有办法:

说图像=' abc'是以b64编码的图像的字符串。

def install():
    if not os.path.isfile("logo.jpg"):
        open('logo.jpg','wb').write(base64.b64decode(image))

要在我的main()函数中运行它,如果图像不存在于文件夹中,它将被创建。之后您只需正常加载图片:

self.img=Image.open('logo.jpg')
self.image=ImageTk.PhotoImage(self.img)

但我找不到完全不保存图像的解决方案。