Как мне хранить изображения в скрипте Python, используя Tkinter?

Я хочу отобразить изображение в tkinter, но всегда получаю сообщение об ошибке, в котором говорится, что изображение (PieTalk.gif) не может быть найдено, даже если изображение находится в том же каталоге, что и скрипт python (startupgui.py):

 /Home/COMP3203/COMP30203-project/src/ptgui/

Вот метод, в котором я хочу визуализировать изображение в графическом интерфейсе. Следующий код является классом с именем startupgui.py. Он состоит из конструктора и метода загрузки изображения.

Конструктор:

def __init__(self):

    # String to decide whether to go to client or server
    self.trigger = None

    #-----------------------#
    # Creating window frame #
    #-----------------------#
    self.root = Tk()
    self.root.wm_title("PieTalk")
    self.root.geometry('600x450')

    # creating PieTalk image
    self.createimage()
    # creating buttons
    self.createbuttons()

Способ загрузки изображения:

def createimage(self):

    # Creating image frame
    self.imageframe = Frame(self.root, bg='light grey')
    self.imageframe.place(relx=0.1, relwidth=0.8, rely=0.05, relheight=0.65)

    # Creating PieTalk image
    self.pietalkimage=PhotoImage(file="PieTalk.gif")

    # Creating label
    self.imagelabel = Label(self.imageframe, image=pietalkimage)
    self.imagelabel.image = self.pietalkimage
    self.imagelabel.pack()

Я использовал только имя файла:

self.pietalkimage=PhotoImage(file="PieTalk.gif")

И я также использовал абсолютный путь к файлу:

self.pietalkimage=PhotoImage(file="/Home/COMP3203/COMP30203-project/src/ptgui/PieTalk.gif")

К сожалению, я продолжаю получать ту же ошибку при выполнении сценария:

Traceback (most recent call last):
  File "pietalk.py", line 361, in <module>
    startview=sgui.startupgui()
  File "/home/archit/COMP3203/COMP3203-project/src/ptgui/startupgui.py", line 66, in __init__
self.createimage()
  File "/home/archit/COMP3203/COMP3203-project/src/ptgui/startupgui.py", line 33, in createimage
  self.pietalkimage=PhotoImage(file="/Home/COMP3203/COMP30203-project/src/ptgui/PieTalk.gif")
  File "/usr/lib/python3.4/tkinter/__init__.py", line 3387, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "/usr/lib/python3.4/tkinter/__init__.py", line 3343, in __init__
self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: couldn't open "/Home/COMP3203/COMP30203-project/src/ptgui/PieTalk.gif": no such file or directory

Есть ли что-то еще, что я делаю неправильно, когда я загружаю изображение? Что еще я могу сделать, чтобы загрузить изображение?

2 ответа

Сначала преобразовать его в переменную base64 python

>>> import base64
>>> with open("my_image.py","w") as f:
...    f.write('my_image="""%s"""'%base64.b64encode(open("my_gif.gif","rb").read()))
...
>>> exit()

теперь у вас должен быть файл my_image.py... скопируйте его в ту же директорию, что и ваш скрипт tkinter... и теперь вы можете сделать

from my_image import my_image
image=PhotoImage(data = my_image)

поскольку у вас есть некоторые проблемы, давайте попробуем немного упростить

img2base64.py

import base64,sys,os,re
assert len(sys.argv) > 2,"Error: Useage %s /path/to/image.gif outfile.py"
assert os.path.exists(sys.argv[1]),"Error Unable to find image passed in as first argument"
outfile = open(sys.argv[2],"w")
raw_binary_data = open(sys.argv[1],"rb").read()
b64_encoded_data = base64.b64encode(raw_binary_data)

varname = re.sub("[^W]","_",os.path.splitext(os.path.basename(sys.argv[1]))[0])
pyname = os.path.splitext(os.path.basename(sys.argv[2]))[0]
outfile.write("%s='''%s'''"%(varname,b64_encoded_data))
outfile.close()

print "all done please put %s in your script directory and use it as follows:"%sys.argv[2]
print "from %s import %s"%(pyname,varname)
print "image=PhotoImage(data = %s)"%(varname)

просто сохраните это и затем назовите это

$ python img2base64.py /path/to/image.gif pyimage.py

Я думаю, по крайней мере, я не пробовал это...

Вдохновленный предыдущим ответом:

      import base64
from pathlib import Path
import sys

src = Path(sys.argv[1])
dst = src.with_suffix(".py")
with dst.open("w") as f:
    data = base64.b64encode(src.read_bytes()).decode('utf-8')
    f.write(f'image="{data}"')
exit()

а я проверял ;-)

Другие вопросы по тегам