我想在Tkinter中使用枕頭顯示圖像,但我得到一個奇怪的錯誤:「處理完成退出代碼-1073741819(0xC0000005)」和Tkinter窗口從未出現。Imagetk.PhotoImage崩潰在Python 3.5 + Tk/Tcl 8.6
下面的代碼(簡化爲最大):
from PIL import Image, ImageTk
from tkinter import Tk
t = Tk()
i = Image.open('data/pic.jpg') # small picture (29kb, 100x100px)
i_tk = ImageTk.PhotoImage(i) # The problem disappears when this line is commented out.
t.mainloop()
我使用Python 3.5,的Tcl/Tk 8.6,枕頭3.0.0在Windows 10(所有64位)
那相同的腳本(用Tkinter替換tkinter)可以在Python 2.7.9,Tcl/Tk 8.5和Pillow 2.9.0的同一臺機器上完美運行(當我關閉Tk窗口時,Tk窗口出現,退出代碼爲0)。
任何幫助將不勝感激。
編輯:根據用戶5510752的建議,我將i_tk = ImageTk.PhotoImage(i)
更改爲i_tk = tkinter.PhotoImage(i)
。問題現在已經從我製作PhotoImage的地方轉移到了將其插入到畫布中的位置。
這裏的新代碼:
from PIL import Image
from tkinter import Tk, PhotoImage, Canvas
t = Tk()
c = Canvas(t, bg="blue")
c.grid(sticky="news")
c.i = Image.open("data/pic.jpg")
c.p = PhotoImage(c.i)
c.create_image(0, 0, image=c.p) # errors out here
t.mainloop()
這給了這個錯誤TypeError: __str__ returned non-string (type JpegImageFile)
。
Traceback (most recent call last):
File "D:/Workspace/PythonProjects/Puzzle 3.5/main.py", line 29, in <module>
c.create_image(0, 0, image=c.p)
File "C:\Python 3.5\lib\tkinter\__init__.py", line 2328, in create_image
return self._create('image', args, kw)
File "C:\Python 3.5\lib\tkinter\__init__.py", line 2319, in _create
*(args + self._options(cnf, kw))))
TypeError: __str__ returned non-string (type JpegImageFile)
我看着Python 3的這個函數的另一個簽名,但是我找不到任何東西。該行適用於Python 2.7,但是(使用ImageTk.PhotoImage
)。更奇怪的是,如果我嘗試將c.i加載到畫布而不是c.p,代碼不會出錯,並且我會得到一個空畫布。
[EDIT2]
按R4PH43L的建議,我嘗試:
from tkinter import Tk, PhotoImage, Canvas
t = Tk()
c = Canvas(t, bg="blue")
c.grid(sticky="news")
c.p=PhotoImage(file="data/pic.jpg")
c.create_image(0, 0, image=c.p) # errors out here
t.mainloop()
這給了一個新的錯誤:
Traceback (most recent call last):
File "D:/Workspace/PythonProjects/Puzzle 3.5/main.py", line 28, in <module>
c.p=PhotoImage(file="data/pic.jpg")
File "C:\Python 3.5\lib\tkinter\__init__.py", line 3393, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
File "C:\Python 3.5\lib\tkinter\__init__.py", line 3349, in __init__
self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: couldn't recognize data in image file "data/pic.jpg"
我用不同的JPEG文件,每次嘗試都無濟於事。這一次,我也嘗試了一個GIF,它工作(但我需要打開JPEG,所以...)。值得注意的是,我的機器上安裝了libjpeg,Pillow似乎沒有任何問題(除了將圖片傳給ImageTk時,我們又回到了原來的錯誤)。如果有人設法在python 3.5的tkinter畫布中顯示一個jpg文件,請發佈您正在使用的Tcl/Tk,libjpeg和Pillow的版本。我懷疑這可能只是兩個模塊在我當前的Python 3配置中不兼容。
您錯過了前導斜槓Image.open('/ data/pic.jpg') –
我試過了,但它找不到帶有前導斜槓的圖片。 – takeshi2010
請給我們完整的錯誤消息,包括。調用堆棧 – R4PH43L