Skip to content

Commit

Permalink
Merge pull request #6032 from radarhere/tk
Browse files Browse the repository at this point in the history
  • Loading branch information
hugovk committed Mar 27, 2022
2 parents 35e1932 + 3114064 commit 57a5066
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 30 deletions.
5 changes: 3 additions & 2 deletions Tests/test_imagetk.py
Expand Up @@ -75,8 +75,9 @@ def test_photoimage_blank():
assert im_tk.width() == 100
assert im_tk.height() == 100

# reloaded = ImageTk.getimage(im_tk)
# assert_image_equal(reloaded, im)
im = Image.new(mode, (100, 100))
reloaded = ImageTk.getimage(im_tk)
assert_image_equal(reloaded.convert(mode), im)


def test_bitmapimage():
Expand Down
57 changes: 29 additions & 28 deletions src/PIL/ImageTk.py
Expand Up @@ -58,6 +58,33 @@ def _get_image_from_kw(kw):
return Image.open(source)


def _pyimagingtkcall(command, photo, id):
tk = photo.tk
try:
tk.call(command, photo, id)
except tkinter.TclError:
# activate Tkinter hook
# may raise an error if it cannot attach to Tkinter
from . import _imagingtk

try:
if hasattr(tk, "interp"):
# Required for PyPy, which always has CFFI installed
from cffi import FFI

ffi = FFI()

# PyPy is using an FFI CDATA element
# (Pdb) self.tk.interp
# <cdata 'Tcl_Interp *' 0x3061b50>
_imagingtk.tkinit(int(ffi.cast("uintptr_t", tk.interp)), 1)
else:
_imagingtk.tkinit(tk.interpaddr(), 1)
except AttributeError:
_imagingtk.tkinit(id(tk), 0)
tk.call(command, photo, id)


# --------------------------------------------------------------------
# PhotoImage

Expand Down Expand Up @@ -170,33 +197,7 @@ def paste(self, im, box=None):
block = image.new_block(self.__mode, im.size)
image.convert2(block, image) # convert directly between buffers

tk = self.__photo.tk

try:
tk.call("PyImagingPhoto", self.__photo, block.id)
except tkinter.TclError:
# activate Tkinter hook
try:
from . import _imagingtk

try:
if hasattr(tk, "interp"):
# Required for PyPy, which always has CFFI installed
from cffi import FFI

ffi = FFI()

# PyPy is using an FFI CDATA element
# (Pdb) self.tk.interp
# <cdata 'Tcl_Interp *' 0x3061b50>
_imagingtk.tkinit(int(ffi.cast("uintptr_t", tk.interp)), 1)
else:
_imagingtk.tkinit(tk.interpaddr(), 1)
except AttributeError:
_imagingtk.tkinit(id(tk), 0)
tk.call("PyImagingPhoto", self.__photo, block.id)
except (ImportError, AttributeError, tkinter.TclError):
raise # configuration problem; cannot attach to Tkinter
_pyimagingtkcall("PyImagingPhoto", self.__photo, block.id)


# --------------------------------------------------------------------
Expand Down Expand Up @@ -276,7 +277,7 @@ def getimage(photo):
im = Image.new("RGBA", (photo.width(), photo.height()))
block = im.im

photo.tk.call("PyImagingPhotoGet", photo, block.id)
_pyimagingtkcall("PyImagingPhotoGet", photo, block.id)

return im

Expand Down

0 comments on commit 57a5066

Please sign in to comment.