| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  | import unittest | 
					
						
							|  |  |  | import tkinter | 
					
						
							|  |  |  | from tkinter import ttk | 
					
						
							| 
									
										
										
										
											2020-11-23 00:51:37 -08:00
										 |  |  | from test import support | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  | from test.support import requires, run_unittest | 
					
						
							| 
									
										
										
										
											2014-08-24 09:07:47 +03:00
										 |  |  | from tkinter.test.support import AbstractTkTest | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | requires('gui') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-23 00:51:37 -08:00
										 |  |  | CLASS_NAMES = [ | 
					
						
							|  |  |  |     '.', 'ComboboxPopdownFrame', 'Heading', | 
					
						
							|  |  |  |     'Horizontal.TProgressbar', 'Horizontal.TScale', 'Item', 'Sash', | 
					
						
							|  |  |  |     'TButton', 'TCheckbutton', 'TCombobox', 'TEntry', | 
					
						
							|  |  |  |     'TLabelframe', 'TLabelframe.Label', 'TMenubutton', | 
					
						
							|  |  |  |     'TNotebook', 'TNotebook.Tab', 'Toolbutton', 'TProgressbar', | 
					
						
							|  |  |  |     'TRadiobutton', 'Treeview', 'TScale', 'TScrollbar', 'TSpinbox', | 
					
						
							|  |  |  |     'Vertical.TProgressbar', 'Vertical.TScale' | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-24 09:07:47 +03:00
										 |  |  | class StyleTest(AbstractTkTest, unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							| 
									
										
										
										
											2014-08-24 09:07:47 +03:00
										 |  |  |         super().setUp() | 
					
						
							|  |  |  |         self.style = ttk.Style(self.root) | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_configure(self): | 
					
						
							|  |  |  |         style = self.style | 
					
						
							|  |  |  |         style.configure('TButton', background='yellow') | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertEqual(style.configure('TButton', 'background'), | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  |             'yellow') | 
					
						
							| 
									
										
										
										
											2013-11-17 00:42:25 +02:00
										 |  |  |         self.assertIsInstance(style.configure('TButton'), dict) | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_map(self): | 
					
						
							|  |  |  |         style = self.style | 
					
						
							| 
									
										
										
										
											2020-11-23 00:51:37 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # Single state | 
					
						
							|  |  |  |         for states in ['active'], [('active',)]: | 
					
						
							|  |  |  |             with self.subTest(states=states): | 
					
						
							|  |  |  |                 style.map('TButton', background=[(*states, 'white')]) | 
					
						
							|  |  |  |                 expected = [('active', 'white')] | 
					
						
							|  |  |  |                 self.assertEqual(style.map('TButton', 'background'), expected) | 
					
						
							|  |  |  |                 m = style.map('TButton') | 
					
						
							|  |  |  |                 self.assertIsInstance(m, dict) | 
					
						
							|  |  |  |                 self.assertEqual(m['background'], expected) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Multiple states | 
					
						
							|  |  |  |         for states in ['pressed', '!disabled'], ['pressed !disabled'], [('pressed', '!disabled')]: | 
					
						
							|  |  |  |             with self.subTest(states=states): | 
					
						
							|  |  |  |                 style.map('TButton', background=[(*states, 'black')]) | 
					
						
							|  |  |  |                 expected = [('pressed', '!disabled', 'black')] | 
					
						
							|  |  |  |                 self.assertEqual(style.map('TButton', 'background'), expected) | 
					
						
							|  |  |  |                 m = style.map('TButton') | 
					
						
							|  |  |  |                 self.assertIsInstance(m, dict) | 
					
						
							|  |  |  |                 self.assertEqual(m['background'], expected) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Default state | 
					
						
							|  |  |  |         for states in [], [''], [()]: | 
					
						
							|  |  |  |             with self.subTest(states=states): | 
					
						
							|  |  |  |                 style.map('TButton', background=[(*states, 'grey')]) | 
					
						
							|  |  |  |                 expected = [('grey',)] | 
					
						
							|  |  |  |                 self.assertEqual(style.map('TButton', 'background'), expected) | 
					
						
							|  |  |  |                 m = style.map('TButton') | 
					
						
							|  |  |  |                 self.assertIsInstance(m, dict) | 
					
						
							|  |  |  |                 self.assertEqual(m['background'], expected) | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_lookup(self): | 
					
						
							|  |  |  |         style = self.style | 
					
						
							|  |  |  |         style.configure('TButton', background='yellow') | 
					
						
							|  |  |  |         style.map('TButton', background=[('active', 'background', 'blue')]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertEqual(style.lookup('TButton', 'background'), 'yellow') | 
					
						
							|  |  |  |         self.assertEqual(style.lookup('TButton', 'background', | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  |             ['active', 'background']), 'blue') | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertEqual(style.lookup('TButton', 'optionnotdefined', | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  |             default='iknewit'), 'iknewit') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_layout(self): | 
					
						
							|  |  |  |         style = self.style | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertRaises(tkinter.TclError, style.layout, 'NotALayout') | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  |         tv_style = style.layout('Treeview') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # "erase" Treeview layout | 
					
						
							|  |  |  |         style.layout('Treeview', '') | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertEqual(style.layout('Treeview'), | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  |             [('null', {'sticky': 'nswe'})] | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # restore layout | 
					
						
							|  |  |  |         style.layout('Treeview', tv_style) | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertEqual(style.layout('Treeview'), tv_style) | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # should return a list | 
					
						
							| 
									
										
										
										
											2013-11-17 00:42:25 +02:00
										 |  |  |         self.assertIsInstance(style.layout('TButton'), list) | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # correct layout, but "option" doesn't exist as option | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertRaises(tkinter.TclError, style.layout, 'Treeview', | 
					
						
							| 
									
										
										
										
											2009-02-21 20:59:32 +00:00
										 |  |  |             [('name', {'option': 'inexistent'})]) | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_theme_use(self): | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertRaises(tkinter.TclError, self.style.theme_use, | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  |             'nonexistingname') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         curr_theme = self.style.theme_use() | 
					
						
							|  |  |  |         new_theme = None | 
					
						
							|  |  |  |         for theme in self.style.theme_names(): | 
					
						
							|  |  |  |             if theme != curr_theme: | 
					
						
							|  |  |  |                 new_theme = theme | 
					
						
							|  |  |  |                 self.style.theme_use(theme) | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             # just one theme available, can't go on with tests | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertFalse(curr_theme == new_theme) | 
					
						
							|  |  |  |         self.assertFalse(new_theme != self.style.theme_use()) | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.style.theme_use(curr_theme) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-23 00:51:37 -08:00
										 |  |  |     def test_configure_custom_copy(self): | 
					
						
							|  |  |  |         style = self.style | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         curr_theme = self.style.theme_use() | 
					
						
							|  |  |  |         self.addCleanup(self.style.theme_use, curr_theme) | 
					
						
							|  |  |  |         for theme in self.style.theme_names(): | 
					
						
							|  |  |  |             self.style.theme_use(theme) | 
					
						
							|  |  |  |             for name in CLASS_NAMES: | 
					
						
							|  |  |  |                 default = style.configure(name) | 
					
						
							|  |  |  |                 if not default: | 
					
						
							|  |  |  |                     continue | 
					
						
							|  |  |  |                 with self.subTest(theme=theme, name=name): | 
					
						
							|  |  |  |                     if support.verbose >= 2: | 
					
						
							|  |  |  |                         print('configure', theme, name, default) | 
					
						
							|  |  |  |                     newname = f'C.{name}' | 
					
						
							|  |  |  |                     self.assertEqual(style.configure(newname), None) | 
					
						
							|  |  |  |                     style.configure(newname, **default) | 
					
						
							|  |  |  |                     self.assertEqual(style.configure(newname), default) | 
					
						
							|  |  |  |                     for key, value in default.items(): | 
					
						
							|  |  |  |                         self.assertEqual(style.configure(newname, key), value) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_map_custom_copy(self): | 
					
						
							|  |  |  |         style = self.style | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         curr_theme = self.style.theme_use() | 
					
						
							|  |  |  |         self.addCleanup(self.style.theme_use, curr_theme) | 
					
						
							|  |  |  |         for theme in self.style.theme_names(): | 
					
						
							|  |  |  |             self.style.theme_use(theme) | 
					
						
							|  |  |  |             for name in CLASS_NAMES: | 
					
						
							|  |  |  |                 default = style.map(name) | 
					
						
							|  |  |  |                 if not default: | 
					
						
							|  |  |  |                     continue | 
					
						
							|  |  |  |                 with self.subTest(theme=theme, name=name): | 
					
						
							|  |  |  |                     if support.verbose >= 2: | 
					
						
							|  |  |  |                         print('map', theme, name, default) | 
					
						
							|  |  |  |                     newname = f'C.{name}' | 
					
						
							|  |  |  |                     self.assertEqual(style.map(newname), {}) | 
					
						
							|  |  |  |                     style.map(newname, **default) | 
					
						
							|  |  |  |                     self.assertEqual(style.map(newname), default) | 
					
						
							|  |  |  |                     for key, value in default.items(): | 
					
						
							|  |  |  |                         self.assertEqual(style.map(newname, key), value) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-28 14:41:10 +00:00
										 |  |  | tests_gui = (StyleTest, ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     run_unittest(*tests_gui) |