我正在使用python(我的版本是2.7 )。 我想添加一个图像到GUI( Tkinter ),然后使用pyinstaller转换成可执行格式。 我确实跟在SO上 ,还像在ActiveState上说的那样
当我提到代码的图像的path,它只有当我直接运行它的作品。 如果我把它转换为exe它不会打开。
像其他解决scheme中提到的那样更改代码,就像将其转换为编码string一样,它在Linux上运行良好。 但在Windows上,它会引发错误
码:
python3 PIL Pillow Ubuntu安装
安装python 3.4的PIL
在Windows上安装Pillow for Python
如何在Windows上安装枕头依赖项(没有二进制文件)?
在Windows上获取Python 2.7 64位的PIL而不是Pillow
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) as
NameError: name 'Tkinter' is not defined
更改2:所以我试图改变线为logoimage = ImageTk.PhotoImage(master=root,data=logo) 。 我得到的错误是
File "C:Python27libsite-packagesPILImageTk.py",line 88,in __init__ image = Image.open(BytesIO(kw["data"])) File "C:Python27libsite-packagesPILImage.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
使用枕头绘制草书文本
为什么在Windows上从Pillow上得到“图像数据不足”,而相同的代码在Linux上运行良好?
安装Pillow错误:安装程序脚本退出,出现错误:命令'x86_64-linux-gnu-gcc'失败,退出状态为1
PIL.Image类没有发现与枕头
做明确的解码和转换可能比你目前正在做的更强大。 这段代码适用于Linux上的Python 2.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 embeddednbase64-encoded PNG').pack() root.mainloop()
作为参考,这里是嵌入式PNG的外观。
from Tkinter import * #... logoimage = Tkinter.PhotoImage(master=root,data=logo)
如果使用import *将Tkinter模块直接转储到全局范围中,则不应将类和函数名称与模块名称相加。 删除前缀,或删除import * 。
import Tkinter #... logoimage = Tkinter.PhotoImage(master=root,data=logo)
要么
from Tkinter import * #... logoimage = PhotoImage(master=root,data=logo)
我怀疑你没有得到在Linux中的错误,因为你的Python版本自动导入公共模块。 实际上,所有脚本的顶部都有一个不可见的import Tkinter 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。