2017-02-11 4 views
0

Ich schreibe ein tkinter-Programm, das einige JPG-Dateien für seinen Hintergrund verwendet. Ich habe jedoch festgestellt, dass die Bilder, die für tkinter-Fenster verwendet werden, nicht zur EXE-Datei kompiliert/hinzugefügt werden, wenn das Skript mit "pyinstaller" in eine EXE-Datei konvertiert wird.Wie verwende ich die base64-codierte Bildzeichenfolge in Tkinter label?

Daher habe ich beschlossen, das Bild im Python-Skript fest zu codieren, so dass es keine externe Abhängigkeit gibt. Zu diesem Zweck habe ich die folgenden Dinge getan:

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

Der obige Code wird zum Dekodieren der Basis 64 codierten Bilddaten verwendet. Ich möchte diese decodierten Bilddaten als Bild verwenden und als Label/Button im tkinter anzeigen.

Zum Beispiel:

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

ist jedoch tkinter nicht den Wert in data gespeichert zu akzeptieren als ein Bild verwendet werden. Es zeigt die folgenden Fehler -

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 
+0

Verwenden Sie Python2 oder Python3? Nach dieser [Frage] (http://stackoverflow.com/questions/27175029/tkinter-will-not-recognize-image-data-in-base64-encoded-string) scheint es mit Python3 möglich zu sein. –

+0

@ j_4321 Ich benutze Python 3. Ich habe diese Frage überprüft und es scheint mein Problem nicht zu lösen. –

+0

Also haben Sie den Code in der [Frage] (http://stackoverflow.com/questions/27175029/tkinter-will-not-recognize-image-data-in-base64-encoded-string) versucht? –

Antwort

1

Tkinter PhotoImage Klasse (in Python 3 mit tk 8.6) kann nur GIF, PGM/PPM und PNG-Bildformate lesen. Es gibt zwei Möglichkeiten, um ein Bild zu lesen:

  • aus einer Datei: PhotoImage(file="path/to/image.png")
  • Von einer Base64-codierten Zeichenfolge: PhotoImage(data=image_data_base64_encoded_string)

Erstens, wenn Sie ein Bild in eine Base64- konvertieren mögen codierte Zeichenfolge:

import base64 

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

verwenden sie dann in Tkinter:

import tkinter as tk 

root = tk.Tk() 

im = PhotoImage(data=image_data_base64_encoded_string) 

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

root.mainloop() 

Ich denke, dass Ihr Problem ist, dass Sie die Zeichenfolge mit datas= base64.b64decode(base64_encodedString) vor der Verwendung in PhotoImage entschlüsselt haben, während Sie base64_encodedString direkt verwendet haben sollten.

+0

In der Tat war der Fehler, wie Sie erraten haben, ich habe den decodierten Wert verwendet, um das Bildobjekt zu erstellen. Vielen Dank ! –

Verwandte Themen