python-无法在windows上将图像添加到GUI(tkinter)

2024-09-27 00:14:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python(我的版本是2.7)。我想将一个图像添加到GUI(Tkinter),然后使用pyinstaller将其转换为可执行格式。 我确实遵循了SO上的规定,也如{a2}所说

当我在代码中提到图像的路径时,它只在我直接运行它时才起作用。如果我把它转换成exe,它就不会打开。在

改变其他解决方案中提到的代码,比如将其转换为编码字符串,它在linux上运行良好。但在windows上它会抛出错误

代码:

from Tkinter import *
from PIL import ImageTk, Image

logo = '''
----- encoded string -----
'''

root = Tk()
logoimage = Tkinter.PhotoImage(master=root, data=logo)
Label(root, image=logoimage).pack()
root.mainloop()

变更1: 上面的代码可以在linux上运行。在windows上,我在logoimage = Tkinter.PhotoImage(master=root, data=logo)行得到的错误是

^{pr2}$

变更2: 所以我尝试将行改为logoimage = ImageTk.PhotoImage(master=root, data=logo)。我得到的错误是

File "C:\Python27\lib\site-packages\PIL\ImageTk.py", line 88, in __init__
    image = Image.open(BytesIO(kw["data"]))
  File "C:\Python27\lib\site-packages\PIL\Image.py", line 2330, in open
    % (filename if filename else fp))
IOError: cannot identify image file <_io.BytesIO object at 0x00000000024BB150>
Exception AttributeError: "'PhotoImage' object has no attribute '_PhotoImage__photo'" in <bound method PhotoImage.__del__ of <PIL.ImageTk.PhotoImage object at 0x00000000024D49E8>> ignored

变更3: 但是,如果我把这行改成iconImage= ImageTk.PhotoImage(Image.open('path_to_image.png'))。只有我直接跑才行。若我将其转换为可执行文件,则控制台将打开2-3秒,并显示类似Unable to locate the image file之类的错误


Tags: 代码inimagemasterdatapiltkinter错误
2条回答
from Tkinter import *
#...
logoimage = Tkinter.PhotoImage(master=root, data=logo)

如果使用import *将Tkinter模块直接转储到全局作用域中,则不应在类和函数名前面加上模块名。删除前缀,或删除import *。在

^{pr2}$

或者

from Tkinter import *
#...
logoimage = PhotoImage(master=root, data=logo)

我怀疑您在Linux中没有得到错误,因为您的Python版本会自动导入公共模块。实际上,在所有脚本的顶部都有一个不可见的import Tkinter。在

显式地进行解码和转换可能比您当前所做的更健壮。这段代码可以在Linux上的python2.6.6上运行。在

import io, base64
from Tkinter import *
from PIL import ImageTk, Image

#A simple 64x64 PNG fading from orange in the top left corner 
# to red in the bottom right, encoded in base64
logo_b64 = '''
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAIA
AAAlC+aJAAAA/0lEQVR4nO3Zyw7CMAxEUdP//+W2rCqBoJA2noclS1kn9yjLeex7xKY76+
wNS+l6KSCjXgdIqhcB8uoVgNR6OiC7ngsA1BMBmHoWAFZPASDr8QBwPRiAr0cCKPUwAKse
AyDWAwDc+mwAvT4VoKjPA4jqkwC6+gyAtD7WSYC6fu4HDOonAB71dwE29bcATvXXAWb1Fw
F+9VcAlvXDANf6MYBx/QDAu/4fwL7+J6BC/TmgSP0JoE79N0Cp+g9Atfp3QMH6F0DN+gNQ
tj62WErXB2PgQNZLAb3U6wC91OsAvdTrAL3U6wC91OsAvdTrAL3U6wC91OsAvdTrAL3Uz7
z+BNmX4gqbppsaAAAAAElFTkSuQmCC
'''

#Decode the PNG data & "wrap" it into a file-like object
fh = io.BytesIO(base64.b64decode(logo_b64))

#Create a PIL image from the PNG data
img = Image.open(fh, mode='r')

#We must open the window before calling ImageTk.PhotoImage
root = Tk()

photo = ImageTk.PhotoImage(image=img)
Label(root, image=photo).pack()
Label(root, text='An embedded\nbase64-encoded PNG').pack()
root.mainloop()

作为参考,下面是嵌入PNG的样子。在

fading from orange in the top left corner to red in the bottom right

相关问题 更多 >

    热门问题