2015-10-31 163 views
0

我想在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配置中不兼容。

+0

您錯過了前導斜槓Image.open('/ data/pic.jpg') –

+0

我試過了,但它找不到帶有前導斜槓的圖片。 – takeshi2010

+0

請給我們完整的錯誤消息,包括。調用堆棧 – R4PH43L

回答

0

你原來的代碼應該很好地工作,但似乎有一些 錯枕頭或傳統知識。

無論如何,如果沒有ImageTk.PhotoImage(),您無法加載jpg,因此無法使用Pillow和Tk加載它,除非有人瞭解導致崩潰的原因。

,我有帶枕頭3.0輪同樣的問題,但它不是真的對我很重要的......

JFYI調用堆棧: https://gist.github.com/DoumanAsh/6dba8411a109fbc68197

附:我有和你一樣的設置。我懷疑在Win平臺的Python 3.5只能使用Tk的8.6,因爲Windows捆綁用的Tcl 8.6.3和Win10介紹了Tcl的支持更新

UPD:

的問題是固定的https://github.com/python-pillow/Pillow/pull/1553

我假設3.0.1版本將包含此修復程序

+0

對不起,我不能upvote你的答案,但我會如果我可以。謝謝你的建設性答案:-)。現在我知道這與我的安裝無關。我結束了爲我的項目恢復Python 2.7.9,除了一些我不能使用的漂亮的Python 3技巧之外,一切都很順利。我希望他們可以修復它。 – takeshi2010

+0

(我接受了,但是,因爲我沒有看到更好的答案) – takeshi2010

+0

雖然你的問題提醒了我這個問題,並將其提升爲枕頭傢伙。也許他們會對此有一些建議:https://github.com/python-pillow/Pillow/issues/1549 – Douman

0

大多數Tkinter的功能已經改變爲Python 3,你的變量,i_tk,必須是這樣的:

i_tk = tkinter.PhotoImage(i) 
+0

感謝您的建議。我已經更新了這個問題,因爲問題似乎已經進一步推遲了。 – takeshi2010

0

看一看這個question。請致電c.p=tkinter.PhotoImage(file="data/pic.jpg")

正如您在堆棧跟蹤中看到的那樣,錯誤發生在參數和關鍵字參數(*args,**kwargs)映射的位置。因爲您只是傳遞沒有關鍵字的圖像,它會嘗試解析您的Image.open([...])作爲位置參數。由於位置參數在這裏作爲字符串讀取,因此失敗。這是你的棧跟蹤告訴我們的。

一眼documentation

The PhotoImage class can read GIF and PGM/PPM images from files

+0

感謝您的鏈接和建議。我仔細閱讀並根據他們做了一些測試。它沒有工作。我用新的堆棧跟蹤編輯了這個問題。謝謝你的幫助。 – takeshi2010

+0

等一下,我會安裝py3並測試它。你已經檢查了jpeg文件,不是嗎? – R4PH43L

+0

謝謝。我檢查了jpg文件,並與來自不同來源的其他人進行了測試。沒有任何工作的JPG文件。雖然GIF工作。 – takeshi2010