我正在使用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)
行得到的错误是
变更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
之类的错误
如果使用
^{pr2}$import *
将Tkinter模块直接转储到全局作用域中,则不应在类和函数名前面加上模块名。删除前缀,或删除import *
。在或者
我怀疑您在Linux中没有得到错误,因为您的Python版本会自动导入公共模块。实际上,在所有脚本的顶部都有一个不可见的
import Tkinter
。在显式地进行解码和转换可能比您当前所做的更健壮。这段代码可以在Linux上的python2.6.6上运行。在
作为参考,下面是嵌入PNG的样子。在
相关问题 更多 >
编程相关推荐