17db96d56Sopenharmony_ciimport unittest 27db96d56Sopenharmony_ciimport sys 37db96d56Sopenharmony_ciimport tkinter 47db96d56Sopenharmony_cifrom tkinter import ttk 57db96d56Sopenharmony_cifrom test import support 67db96d56Sopenharmony_cifrom test.support import requires 77db96d56Sopenharmony_cifrom tkinter.test.support import AbstractTkTest, get_tk_patchlevel 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_cirequires('gui') 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ciCLASS_NAMES = [ 127db96d56Sopenharmony_ci '.', 'ComboboxPopdownFrame', 'Heading', 137db96d56Sopenharmony_ci 'Horizontal.TProgressbar', 'Horizontal.TScale', 'Item', 'Sash', 147db96d56Sopenharmony_ci 'TButton', 'TCheckbutton', 'TCombobox', 'TEntry', 157db96d56Sopenharmony_ci 'TLabelframe', 'TLabelframe.Label', 'TMenubutton', 167db96d56Sopenharmony_ci 'TNotebook', 'TNotebook.Tab', 'Toolbutton', 'TProgressbar', 177db96d56Sopenharmony_ci 'TRadiobutton', 'Treeview', 'TScale', 'TScrollbar', 'TSpinbox', 187db96d56Sopenharmony_ci 'Vertical.TProgressbar', 'Vertical.TScale' 197db96d56Sopenharmony_ci] 207db96d56Sopenharmony_ci 217db96d56Sopenharmony_ciclass StyleTest(AbstractTkTest, unittest.TestCase): 227db96d56Sopenharmony_ci 237db96d56Sopenharmony_ci def setUp(self): 247db96d56Sopenharmony_ci super().setUp() 257db96d56Sopenharmony_ci self.style = ttk.Style(self.root) 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ci 287db96d56Sopenharmony_ci def test_configure(self): 297db96d56Sopenharmony_ci style = self.style 307db96d56Sopenharmony_ci style.configure('TButton', background='yellow') 317db96d56Sopenharmony_ci self.assertEqual(style.configure('TButton', 'background'), 327db96d56Sopenharmony_ci 'yellow') 337db96d56Sopenharmony_ci self.assertIsInstance(style.configure('TButton'), dict) 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci def test_map(self): 377db96d56Sopenharmony_ci style = self.style 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ci # Single state 407db96d56Sopenharmony_ci for states in ['active'], [('active',)]: 417db96d56Sopenharmony_ci with self.subTest(states=states): 427db96d56Sopenharmony_ci style.map('TButton', background=[(*states, 'white')]) 437db96d56Sopenharmony_ci expected = [('active', 'white')] 447db96d56Sopenharmony_ci self.assertEqual(style.map('TButton', 'background'), expected) 457db96d56Sopenharmony_ci m = style.map('TButton') 467db96d56Sopenharmony_ci self.assertIsInstance(m, dict) 477db96d56Sopenharmony_ci self.assertEqual(m['background'], expected) 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ci # Multiple states 507db96d56Sopenharmony_ci for states in ['pressed', '!disabled'], ['pressed !disabled'], [('pressed', '!disabled')]: 517db96d56Sopenharmony_ci with self.subTest(states=states): 527db96d56Sopenharmony_ci style.map('TButton', background=[(*states, 'black')]) 537db96d56Sopenharmony_ci expected = [('pressed', '!disabled', 'black')] 547db96d56Sopenharmony_ci self.assertEqual(style.map('TButton', 'background'), expected) 557db96d56Sopenharmony_ci m = style.map('TButton') 567db96d56Sopenharmony_ci self.assertIsInstance(m, dict) 577db96d56Sopenharmony_ci self.assertEqual(m['background'], expected) 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci # Default state 607db96d56Sopenharmony_ci for states in [], [''], [()]: 617db96d56Sopenharmony_ci with self.subTest(states=states): 627db96d56Sopenharmony_ci style.map('TButton', background=[(*states, 'grey')]) 637db96d56Sopenharmony_ci expected = [('grey',)] 647db96d56Sopenharmony_ci self.assertEqual(style.map('TButton', 'background'), expected) 657db96d56Sopenharmony_ci m = style.map('TButton') 667db96d56Sopenharmony_ci self.assertIsInstance(m, dict) 677db96d56Sopenharmony_ci self.assertEqual(m['background'], expected) 687db96d56Sopenharmony_ci 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci def test_lookup(self): 717db96d56Sopenharmony_ci style = self.style 727db96d56Sopenharmony_ci style.configure('TButton', background='yellow') 737db96d56Sopenharmony_ci style.map('TButton', background=[('active', 'background', 'blue')]) 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ci self.assertEqual(style.lookup('TButton', 'background'), 'yellow') 767db96d56Sopenharmony_ci self.assertEqual(style.lookup('TButton', 'background', 777db96d56Sopenharmony_ci ['active', 'background']), 'blue') 787db96d56Sopenharmony_ci self.assertEqual(style.lookup('TButton', 'optionnotdefined', 797db96d56Sopenharmony_ci default='iknewit'), 'iknewit') 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_ci def test_layout(self): 837db96d56Sopenharmony_ci style = self.style 847db96d56Sopenharmony_ci self.assertRaises(tkinter.TclError, style.layout, 'NotALayout') 857db96d56Sopenharmony_ci tv_style = style.layout('Treeview') 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_ci # "erase" Treeview layout 887db96d56Sopenharmony_ci style.layout('Treeview', '') 897db96d56Sopenharmony_ci self.assertEqual(style.layout('Treeview'), 907db96d56Sopenharmony_ci [('null', {'sticky': 'nswe'})] 917db96d56Sopenharmony_ci ) 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ci # restore layout 947db96d56Sopenharmony_ci style.layout('Treeview', tv_style) 957db96d56Sopenharmony_ci self.assertEqual(style.layout('Treeview'), tv_style) 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci # should return a list 987db96d56Sopenharmony_ci self.assertIsInstance(style.layout('TButton'), list) 997db96d56Sopenharmony_ci 1007db96d56Sopenharmony_ci # correct layout, but "option" doesn't exist as option 1017db96d56Sopenharmony_ci self.assertRaises(tkinter.TclError, style.layout, 'Treeview', 1027db96d56Sopenharmony_ci [('name', {'option': 'inexistent'})]) 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_ci 1057db96d56Sopenharmony_ci def test_theme_use(self): 1067db96d56Sopenharmony_ci self.assertRaises(tkinter.TclError, self.style.theme_use, 1077db96d56Sopenharmony_ci 'nonexistingname') 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci curr_theme = self.style.theme_use() 1107db96d56Sopenharmony_ci new_theme = None 1117db96d56Sopenharmony_ci for theme in self.style.theme_names(): 1127db96d56Sopenharmony_ci if theme != curr_theme: 1137db96d56Sopenharmony_ci new_theme = theme 1147db96d56Sopenharmony_ci self.style.theme_use(theme) 1157db96d56Sopenharmony_ci break 1167db96d56Sopenharmony_ci else: 1177db96d56Sopenharmony_ci # just one theme available, can't go on with tests 1187db96d56Sopenharmony_ci return 1197db96d56Sopenharmony_ci 1207db96d56Sopenharmony_ci self.assertFalse(curr_theme == new_theme) 1217db96d56Sopenharmony_ci self.assertFalse(new_theme != self.style.theme_use()) 1227db96d56Sopenharmony_ci 1237db96d56Sopenharmony_ci self.style.theme_use(curr_theme) 1247db96d56Sopenharmony_ci 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ci def test_configure_custom_copy(self): 1277db96d56Sopenharmony_ci style = self.style 1287db96d56Sopenharmony_ci 1297db96d56Sopenharmony_ci curr_theme = self.style.theme_use() 1307db96d56Sopenharmony_ci self.addCleanup(self.style.theme_use, curr_theme) 1317db96d56Sopenharmony_ci for theme in self.style.theme_names(): 1327db96d56Sopenharmony_ci self.style.theme_use(theme) 1337db96d56Sopenharmony_ci for name in CLASS_NAMES: 1347db96d56Sopenharmony_ci default = style.configure(name) 1357db96d56Sopenharmony_ci if not default: 1367db96d56Sopenharmony_ci continue 1377db96d56Sopenharmony_ci with self.subTest(theme=theme, name=name): 1387db96d56Sopenharmony_ci if support.verbose >= 2: 1397db96d56Sopenharmony_ci print('configure', theme, name, default) 1407db96d56Sopenharmony_ci if (theme in ('vista', 'xpnative') 1417db96d56Sopenharmony_ci and sys.getwindowsversion()[:2] == (6, 1)): 1427db96d56Sopenharmony_ci # Fails on the Windows 7 buildbot 1437db96d56Sopenharmony_ci continue 1447db96d56Sopenharmony_ci newname = f'C.{name}' 1457db96d56Sopenharmony_ci self.assertEqual(style.configure(newname), None) 1467db96d56Sopenharmony_ci style.configure(newname, **default) 1477db96d56Sopenharmony_ci self.assertEqual(style.configure(newname), default) 1487db96d56Sopenharmony_ci for key, value in default.items(): 1497db96d56Sopenharmony_ci self.assertEqual(style.configure(newname, key), value) 1507db96d56Sopenharmony_ci 1517db96d56Sopenharmony_ci 1527db96d56Sopenharmony_ci def test_map_custom_copy(self): 1537db96d56Sopenharmony_ci style = self.style 1547db96d56Sopenharmony_ci 1557db96d56Sopenharmony_ci curr_theme = self.style.theme_use() 1567db96d56Sopenharmony_ci self.addCleanup(self.style.theme_use, curr_theme) 1577db96d56Sopenharmony_ci for theme in self.style.theme_names(): 1587db96d56Sopenharmony_ci self.style.theme_use(theme) 1597db96d56Sopenharmony_ci for name in CLASS_NAMES: 1607db96d56Sopenharmony_ci default = style.map(name) 1617db96d56Sopenharmony_ci if not default: 1627db96d56Sopenharmony_ci continue 1637db96d56Sopenharmony_ci with self.subTest(theme=theme, name=name): 1647db96d56Sopenharmony_ci if support.verbose >= 2: 1657db96d56Sopenharmony_ci print('map', theme, name, default) 1667db96d56Sopenharmony_ci if (theme in ('vista', 'xpnative') 1677db96d56Sopenharmony_ci and sys.getwindowsversion()[:2] == (6, 1)): 1687db96d56Sopenharmony_ci # Fails on the Windows 7 buildbot 1697db96d56Sopenharmony_ci continue 1707db96d56Sopenharmony_ci newname = f'C.{name}' 1717db96d56Sopenharmony_ci self.assertEqual(style.map(newname), {}) 1727db96d56Sopenharmony_ci style.map(newname, **default) 1737db96d56Sopenharmony_ci if theme == 'alt' and name == '.' and get_tk_patchlevel() < (8, 6, 1): 1747db96d56Sopenharmony_ci default['embossed'] = [('disabled', '1')] 1757db96d56Sopenharmony_ci self.assertEqual(style.map(newname), default) 1767db96d56Sopenharmony_ci for key, value in default.items(): 1777db96d56Sopenharmony_ci self.assertEqual(style.map(newname, key), value) 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ci 1807db96d56Sopenharmony_ciif __name__ == "__main__": 1817db96d56Sopenharmony_ci unittest.main() 182