2017-02-11 21 views
0

Я пишу программу tkinter, которая использует некоторые файлы JPG для своего фона. Тем не менее, я обнаружил, что, когда сценарий преобразуется в файл .exe с помощью «pyinstaller», изображения, используемые для окон tkinter, не компилируются/не добавляются в файл .exe.Как использовать строку изображения с кодировкой base64 в ярлыке Tkinter?

Поэтому я решил записать жесткий диск в сценарии 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 
+0

Вы используете python2 или python3? В соответствии с этим [вопросом] (http://stackoverflow.com/questions/27175029/tkinter-will-not-recognize-image-data-in-base64-encoded-string) это похоже на python3. –

+0

@ j_4321 Я использую Python 3. Я проверил этот вопрос, и он, похоже, не решает мою проблему. –

+0

Итак, вы пробовали код, указанный в [вопросе] (http://stackoverflow.com/questions/27175029/tkinter-will-not-recognize-image-data-in-base64-encoded-string)? –

ответ

1

Tkinter PhotoImage класс (в Python 3 с тк 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 напрямую.

+0

Действительно, ошибка была, как вы догадались, я использовал декодированное значение для создания объекта изображения. Благодаря ! –

 Смежные вопросы

  • Нет связанных вопросов^_^