@@ -356,6 +356,50 @@ def test_get(self):
356356 self .assertRaises (tkinter .TclError , image .get , 16 , 15 )
357357 self .assertRaises (tkinter .TclError , image .get , 15 , 16 )
358358
359+ def test_read (self ):
360+ # Due to the Tk bug https://core.tcl-lang.org/tk/tktview/1576528
361+ # the -from option does not work correctly for GIF and PNG files.
362+ # Use the PPM file for this test.
363+ testfile = support .findfile ('python.ppm' , subdir = 'tkinterdata' )
364+ image = tkinter .PhotoImage (master = self .root , file = testfile )
365+
366+ image2 = tkinter .PhotoImage (master = self .root )
367+ image2 .read (testfile )
368+ self .assertEqual (image2 .type (), 'photo' )
369+ self .assertEqual (image2 .width (), 16 )
370+ self .assertEqual (image2 .height (), 16 )
371+ self .assertEqual (image2 .get (0 , 0 ), image .get (0 , 0 ))
372+ self .assertEqual (image2 .get (4 , 6 ), image .get (4 , 6 ))
373+
374+ self .assertRaises (tkinter .TclError , image2 .read , self .testfile , 'ppm' )
375+
376+ image2 = tkinter .PhotoImage (master = self .root )
377+ image2 .read (testfile , from_ = (2 , 3 , 14 , 11 ))
378+ self .assertEqual (image2 .width (), 12 )
379+ self .assertEqual (image2 .height (), 8 )
380+ self .assertEqual (image2 .get (0 , 0 ), image .get (2 , 3 ))
381+ self .assertEqual (image2 .get (11 , 7 ), image .get (13 , 10 ))
382+ self .assertEqual (image2 .get (2 , 4 ), image .get (2 + 2 , 4 + 3 ))
383+
384+ image2 = tkinter .PhotoImage (master = self .root , file = testfile )
385+ self .assertEqual (image2 .width (), 16 )
386+ self .assertEqual (image2 .height (), 16 )
387+ image2 .read (testfile , from_ = (2 , 3 , 14 , 11 ), shrink = True )
388+ self .assertEqual (image2 .width (), 12 )
389+ self .assertEqual (image2 .height (), 8 )
390+ self .assertEqual (image2 .get (0 , 0 ), image .get (2 , 3 ))
391+ self .assertEqual (image2 .get (11 , 7 ), image .get (13 , 10 ))
392+ self .assertEqual (image2 .get (2 , 4 ), image .get (2 + 2 , 4 + 3 ))
393+
394+ image2 = tkinter .PhotoImage (master = self .root )
395+ image2 .read (testfile , from_ = (2 , 3 , 14 , 11 ), to = (3 , 6 ))
396+ self .assertEqual (image2 .type (), 'photo' )
397+ self .assertEqual (image2 .width (), 15 )
398+ self .assertEqual (image2 .height (), 14 )
399+ self .assertEqual (image2 .get (0 + 3 , 0 + 6 ), image .get (2 , 3 ))
400+ self .assertEqual (image2 .get (11 + 3 , 7 + 6 ), image .get (13 , 10 ))
401+ self .assertEqual (image2 .get (2 + 3 , 4 + 6 ), image .get (2 + 2 , 4 + 3 ))
402+
359403 def test_write (self ):
360404 filename = os_helper .TESTFN
361405 import locale
@@ -367,26 +411,78 @@ def test_write(self):
367411
368412 image .write (filename )
369413 image2 = tkinter .PhotoImage ('::img::test2' , master = self .root ,
370- format = 'ppm' ,
371- file = filename )
414+ format = 'ppm' , file = filename )
372415 self .assertEqual (str (image2 ), '::img::test2' )
373416 self .assertEqual (image2 .type (), 'photo' )
374417 self .assertEqual (image2 .width (), 16 )
375418 self .assertEqual (image2 .height (), 16 )
376419 self .assertEqual (image2 .get (0 , 0 ), image .get (0 , 0 ))
377- self .assertEqual (image2 .get (15 , 8 ), image .get (15 , 8 ))
420+ self .assertEqual (image2 .get (4 , 6 ), image .get (4 , 6 ))
378421
379422 image .write (filename , format = 'gif' , from_coords = (4 , 6 , 6 , 9 ))
380423 image3 = tkinter .PhotoImage ('::img::test3' , master = self .root ,
381- format = 'gif' ,
382- file = filename )
424+ format = 'gif' , file = filename )
383425 self .assertEqual (str (image3 ), '::img::test3' )
384426 self .assertEqual (image3 .type (), 'photo' )
385427 self .assertEqual (image3 .width (), 2 )
386428 self .assertEqual (image3 .height (), 3 )
387429 self .assertEqual (image3 .get (0 , 0 ), image .get (4 , 6 ))
388430 self .assertEqual (image3 .get (1 , 2 ), image .get (5 , 8 ))
389431
432+ image .write (filename , background = '#ff0000' )
433+ image4 = tkinter .PhotoImage ('::img::test4' , master = self .root ,
434+ format = 'ppm' , file = filename )
435+ self .assertEqual (image4 .get (0 , 0 ), (255 , 0 , 0 ))
436+ self .assertEqual (image4 .get (4 , 6 ), image .get (4 , 6 ))
437+
438+ image .write (filename , grayscale = True )
439+ image5 = tkinter .PhotoImage ('::img::test5' , master = self .root ,
440+ format = 'ppm' , file = filename )
441+ c = image5 .get (4 , 6 )
442+ self .assertTrue (c [0 ] == c [1 ] == c [2 ], c )
443+
444+ def test_data (self ):
445+ image = self .create ()
446+
447+ data = image .data ()
448+ self .assertIsInstance (data , tuple )
449+ for row in data :
450+ self .assertIsInstance (row , str )
451+ self .assertEqual (data [6 ].split ()[4 ], '#%02x%02x%02x' % image .get (4 , 6 ))
452+
453+ data = image .data ('ppm' )
454+ image2 = tkinter .PhotoImage ('::img::test2' , master = self .root ,
455+ format = 'ppm' , data = data )
456+ self .assertEqual (str (image2 ), '::img::test2' )
457+ self .assertEqual (image2 .type (), 'photo' )
458+ self .assertEqual (image2 .width (), 16 )
459+ self .assertEqual (image2 .height (), 16 )
460+ self .assertEqual (image2 .get (0 , 0 ), image .get (0 , 0 ))
461+ self .assertEqual (image2 .get (4 , 6 ), image .get (4 , 6 ))
462+
463+ data = image .data (format = 'gif' , from_ = (4 , 6 , 6 , 9 ))
464+ image3 = tkinter .PhotoImage ('::img::test3' , master = self .root ,
465+ format = 'gif' , data = data )
466+ self .assertEqual (str (image3 ), '::img::test3' )
467+ self .assertEqual (image3 .type (), 'photo' )
468+ self .assertEqual (image3 .width (), 2 )
469+ self .assertEqual (image3 .height (), 3 )
470+ self .assertEqual (image3 .get (0 , 0 ), image .get (4 , 6 ))
471+ self .assertEqual (image3 .get (1 , 2 ), image .get (5 , 8 ))
472+
473+ data = image .data ('ppm' , background = '#ff0000' )
474+ image4 = tkinter .PhotoImage ('::img::test4' , master = self .root ,
475+ format = 'ppm' , data = data )
476+ self .assertEqual (image4 .get (0 , 0 ), (255 , 0 , 0 ))
477+ self .assertEqual (image4 .get (4 , 6 ), image .get (4 , 6 ))
478+
479+ data = image .data ('ppm' , grayscale = True )
480+ image5 = tkinter .PhotoImage ('::img::test5' , master = self .root ,
481+ format = 'ppm' , data = data )
482+ c = image5 .get (4 , 6 )
483+ self .assertTrue (c [0 ] == c [1 ] == c [2 ], c )
484+
485+
390486 def test_transparency (self ):
391487 image = self .create ()
392488 self .assertEqual (image .transparency_get (0 , 0 ), True )
0 commit comments