test_images.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. import unittest
  2. import tkinter
  3. from test import support
  4. from tkinter.test.support import AbstractTkTest, requires_tcl
  5. support.requires('gui')
  6. class MiscTest(AbstractTkTest, unittest.TestCase):
  7. def test_image_types(self):
  8. image_types = self.root.image_types()
  9. self.assertIsInstance(image_types, tuple)
  10. self.assertIn('photo', image_types)
  11. self.assertIn('bitmap', image_types)
  12. def test_image_names(self):
  13. image_names = self.root.image_names()
  14. self.assertIsInstance(image_names, tuple)
  15. class BitmapImageTest(AbstractTkTest, unittest.TestCase):
  16. @classmethod
  17. def setUpClass(cls):
  18. AbstractTkTest.setUpClass.__func__(cls)
  19. cls.testfile = support.findfile('python.xbm', subdir='imghdrdata')
  20. def test_create_from_file(self):
  21. image = tkinter.BitmapImage('::img::test', master=self.root,
  22. foreground='yellow', background='blue',
  23. file=self.testfile)
  24. self.assertEqual(str(image), '::img::test')
  25. self.assertEqual(image.type(), 'bitmap')
  26. self.assertEqual(image.width(), 16)
  27. self.assertEqual(image.height(), 16)
  28. self.assertIn('::img::test', self.root.image_names())
  29. del image
  30. self.assertNotIn('::img::test', self.root.image_names())
  31. def test_create_from_data(self):
  32. with open(self.testfile, 'rb') as f:
  33. data = f.read()
  34. image = tkinter.BitmapImage('::img::test', master=self.root,
  35. foreground='yellow', background='blue',
  36. data=data)
  37. self.assertEqual(str(image), '::img::test')
  38. self.assertEqual(image.type(), 'bitmap')
  39. self.assertEqual(image.width(), 16)
  40. self.assertEqual(image.height(), 16)
  41. self.assertIn('::img::test', self.root.image_names())
  42. del image
  43. self.assertNotIn('::img::test', self.root.image_names())
  44. def assertEqualStrList(self, actual, expected):
  45. self.assertIsInstance(actual, str)
  46. self.assertEqual(self.root.splitlist(actual), expected)
  47. def test_configure_data(self):
  48. image = tkinter.BitmapImage('::img::test', master=self.root)
  49. self.assertEqual(image['data'], '-data {} {} {} {}')
  50. with open(self.testfile, 'rb') as f:
  51. data = f.read()
  52. image.configure(data=data)
  53. self.assertEqualStrList(image['data'],
  54. ('-data', '', '', '', data.decode('ascii')))
  55. self.assertEqual(image.width(), 16)
  56. self.assertEqual(image.height(), 16)
  57. self.assertEqual(image['maskdata'], '-maskdata {} {} {} {}')
  58. image.configure(maskdata=data)
  59. self.assertEqualStrList(image['maskdata'],
  60. ('-maskdata', '', '', '', data.decode('ascii')))
  61. def test_configure_file(self):
  62. image = tkinter.BitmapImage('::img::test', master=self.root)
  63. self.assertEqual(image['file'], '-file {} {} {} {}')
  64. image.configure(file=self.testfile)
  65. self.assertEqualStrList(image['file'],
  66. ('-file', '', '', '',self.testfile))
  67. self.assertEqual(image.width(), 16)
  68. self.assertEqual(image.height(), 16)
  69. self.assertEqual(image['maskfile'], '-maskfile {} {} {} {}')
  70. image.configure(maskfile=self.testfile)
  71. self.assertEqualStrList(image['maskfile'],
  72. ('-maskfile', '', '', '', self.testfile))
  73. def test_configure_background(self):
  74. image = tkinter.BitmapImage('::img::test', master=self.root)
  75. self.assertEqual(image['background'], '-background {} {} {} {}')
  76. image.configure(background='blue')
  77. self.assertEqual(image['background'], '-background {} {} {} blue')
  78. def test_configure_foreground(self):
  79. image = tkinter.BitmapImage('::img::test', master=self.root)
  80. self.assertEqual(image['foreground'],
  81. '-foreground {} {} #000000 #000000')
  82. image.configure(foreground='yellow')
  83. self.assertEqual(image['foreground'],
  84. '-foreground {} {} #000000 yellow')
  85. class PhotoImageTest(AbstractTkTest, unittest.TestCase):
  86. @classmethod
  87. def setUpClass(cls):
  88. AbstractTkTest.setUpClass.__func__(cls)
  89. cls.testfile = support.findfile('python.gif', subdir='imghdrdata')
  90. def create(self):
  91. return tkinter.PhotoImage('::img::test', master=self.root,
  92. file=self.testfile)
  93. def colorlist(self, *args):
  94. if tkinter.TkVersion >= 8.6 and self.wantobjects:
  95. return args
  96. else:
  97. return tkinter._join(args)
  98. def check_create_from_file(self, ext):
  99. testfile = support.findfile('python.' + ext, subdir='imghdrdata')
  100. image = tkinter.PhotoImage('::img::test', master=self.root,
  101. file=testfile)
  102. self.assertEqual(str(image), '::img::test')
  103. self.assertEqual(image.type(), 'photo')
  104. self.assertEqual(image.width(), 16)
  105. self.assertEqual(image.height(), 16)
  106. self.assertEqual(image['data'], '')
  107. self.assertEqual(image['file'], testfile)
  108. self.assertIn('::img::test', self.root.image_names())
  109. del image
  110. self.assertNotIn('::img::test', self.root.image_names())
  111. def check_create_from_data(self, ext):
  112. testfile = support.findfile('python.' + ext, subdir='imghdrdata')
  113. with open(testfile, 'rb') as f:
  114. data = f.read()
  115. image = tkinter.PhotoImage('::img::test', master=self.root,
  116. data=data)
  117. self.assertEqual(str(image), '::img::test')
  118. self.assertEqual(image.type(), 'photo')
  119. self.assertEqual(image.width(), 16)
  120. self.assertEqual(image.height(), 16)
  121. self.assertEqual(image['data'], data if self.wantobjects
  122. else data.decode('latin1'))
  123. self.assertEqual(image['file'], '')
  124. self.assertIn('::img::test', self.root.image_names())
  125. del image
  126. self.assertNotIn('::img::test', self.root.image_names())
  127. def test_create_from_ppm_file(self):
  128. self.check_create_from_file('ppm')
  129. def test_create_from_ppm_data(self):
  130. self.check_create_from_data('ppm')
  131. def test_create_from_pgm_file(self):
  132. self.check_create_from_file('pgm')
  133. def test_create_from_pgm_data(self):
  134. self.check_create_from_data('pgm')
  135. def test_create_from_gif_file(self):
  136. self.check_create_from_file('gif')
  137. def test_create_from_gif_data(self):
  138. self.check_create_from_data('gif')
  139. @requires_tcl(8, 6)
  140. def test_create_from_png_file(self):
  141. self.check_create_from_file('png')
  142. @requires_tcl(8, 6)
  143. def test_create_from_png_data(self):
  144. self.check_create_from_data('png')
  145. def test_configure_data(self):
  146. image = tkinter.PhotoImage('::img::test', master=self.root)
  147. self.assertEqual(image['data'], '')
  148. with open(self.testfile, 'rb') as f:
  149. data = f.read()
  150. image.configure(data=data)
  151. self.assertEqual(image['data'], data if self.wantobjects
  152. else data.decode('latin1'))
  153. self.assertEqual(image.width(), 16)
  154. self.assertEqual(image.height(), 16)
  155. def test_configure_format(self):
  156. image = tkinter.PhotoImage('::img::test', master=self.root)
  157. self.assertEqual(image['format'], '')
  158. image.configure(file=self.testfile, format='gif')
  159. self.assertEqual(image['format'], ('gif',) if self.wantobjects
  160. else 'gif')
  161. self.assertEqual(image.width(), 16)
  162. self.assertEqual(image.height(), 16)
  163. def test_configure_file(self):
  164. image = tkinter.PhotoImage('::img::test', master=self.root)
  165. self.assertEqual(image['file'], '')
  166. image.configure(file=self.testfile)
  167. self.assertEqual(image['file'], self.testfile)
  168. self.assertEqual(image.width(), 16)
  169. self.assertEqual(image.height(), 16)
  170. def test_configure_gamma(self):
  171. image = tkinter.PhotoImage('::img::test', master=self.root)
  172. self.assertEqual(image['gamma'], '1.0')
  173. image.configure(gamma=2.0)
  174. self.assertEqual(image['gamma'], '2.0')
  175. def test_configure_width_height(self):
  176. image = tkinter.PhotoImage('::img::test', master=self.root)
  177. self.assertEqual(image['width'], '0')
  178. self.assertEqual(image['height'], '0')
  179. image.configure(width=20)
  180. image.configure(height=10)
  181. self.assertEqual(image['width'], '20')
  182. self.assertEqual(image['height'], '10')
  183. self.assertEqual(image.width(), 20)
  184. self.assertEqual(image.height(), 10)
  185. def test_configure_palette(self):
  186. image = tkinter.PhotoImage('::img::test', master=self.root)
  187. self.assertEqual(image['palette'], '')
  188. image.configure(palette=256)
  189. self.assertEqual(image['palette'], '256')
  190. image.configure(palette='3/4/2')
  191. self.assertEqual(image['palette'], '3/4/2')
  192. def test_blank(self):
  193. image = self.create()
  194. image.blank()
  195. self.assertEqual(image.width(), 16)
  196. self.assertEqual(image.height(), 16)
  197. self.assertEqual(image.get(4, 6), self.colorlist(0, 0, 0))
  198. def test_copy(self):
  199. image = self.create()
  200. image2 = image.copy()
  201. self.assertEqual(image2.width(), 16)
  202. self.assertEqual(image2.height(), 16)
  203. self.assertEqual(image.get(4, 6), image.get(4, 6))
  204. def test_subsample(self):
  205. image = self.create()
  206. image2 = image.subsample(2, 3)
  207. self.assertEqual(image2.width(), 8)
  208. self.assertEqual(image2.height(), 6)
  209. self.assertEqual(image2.get(2, 2), image.get(4, 6))
  210. image2 = image.subsample(2)
  211. self.assertEqual(image2.width(), 8)
  212. self.assertEqual(image2.height(), 8)
  213. self.assertEqual(image2.get(2, 3), image.get(4, 6))
  214. def test_zoom(self):
  215. image = self.create()
  216. image2 = image.zoom(2, 3)
  217. self.assertEqual(image2.width(), 32)
  218. self.assertEqual(image2.height(), 48)
  219. self.assertEqual(image2.get(8, 18), image.get(4, 6))
  220. self.assertEqual(image2.get(9, 20), image.get(4, 6))
  221. image2 = image.zoom(2)
  222. self.assertEqual(image2.width(), 32)
  223. self.assertEqual(image2.height(), 32)
  224. self.assertEqual(image2.get(8, 12), image.get(4, 6))
  225. self.assertEqual(image2.get(9, 13), image.get(4, 6))
  226. def test_put(self):
  227. image = self.create()
  228. image.put('{red green} {blue yellow}', to=(4, 6))
  229. self.assertEqual(image.get(4, 6), self.colorlist(255, 0, 0))
  230. self.assertEqual(image.get(5, 6),
  231. self.colorlist(0, 128 if tkinter.TkVersion >= 8.6
  232. else 255, 0))
  233. self.assertEqual(image.get(4, 7), self.colorlist(0, 0, 255))
  234. self.assertEqual(image.get(5, 7), self.colorlist(255, 255, 0))
  235. image.put((('#f00', '#00ff00'), ('#000000fff', '#ffffffff0000')))
  236. self.assertEqual(image.get(0, 0), self.colorlist(255, 0, 0))
  237. self.assertEqual(image.get(1, 0), self.colorlist(0, 255, 0))
  238. self.assertEqual(image.get(0, 1), self.colorlist(0, 0, 255))
  239. self.assertEqual(image.get(1, 1), self.colorlist(255, 255, 0))
  240. def test_get(self):
  241. image = self.create()
  242. self.assertEqual(image.get(4, 6), self.colorlist(62, 116, 162))
  243. self.assertEqual(image.get(0, 0), self.colorlist(0, 0, 0))
  244. self.assertEqual(image.get(15, 15), self.colorlist(0, 0, 0))
  245. self.assertRaises(tkinter.TclError, image.get, -1, 0)
  246. self.assertRaises(tkinter.TclError, image.get, 0, -1)
  247. self.assertRaises(tkinter.TclError, image.get, 16, 15)
  248. self.assertRaises(tkinter.TclError, image.get, 15, 16)
  249. def test_write(self):
  250. image = self.create()
  251. self.addCleanup(support.unlink, support.TESTFN)
  252. image.write(support.TESTFN)
  253. image2 = tkinter.PhotoImage('::img::test2', master=self.root,
  254. format='ppm',
  255. file=support.TESTFN)
  256. self.assertEqual(str(image2), '::img::test2')
  257. self.assertEqual(image2.type(), 'photo')
  258. self.assertEqual(image2.width(), 16)
  259. self.assertEqual(image2.height(), 16)
  260. self.assertEqual(image2.get(0, 0), image.get(0, 0))
  261. self.assertEqual(image2.get(15, 8), image.get(15, 8))
  262. image.write(support.TESTFN, format='gif', from_coords=(4, 6, 6, 9))
  263. image3 = tkinter.PhotoImage('::img::test3', master=self.root,
  264. format='gif',
  265. file=support.TESTFN)
  266. self.assertEqual(str(image3), '::img::test3')
  267. self.assertEqual(image3.type(), 'photo')
  268. self.assertEqual(image3.width(), 2)
  269. self.assertEqual(image3.height(), 3)
  270. self.assertEqual(image3.get(0, 0), image.get(4, 6))
  271. self.assertEqual(image3.get(1, 2), image.get(5, 8))
  272. tests_gui = (MiscTest, BitmapImageTest, PhotoImageTest,)
  273. if __name__ == "__main__":
  274. support.run_unittest(*tests_gui)