source: titan/mediathek/localhoster/lib/python2.7/lib-tk/test/test_tkinter/test_geometry_managers.py @ 40661

Last change on this file since 40661 was 40661, checked in by obi, 7 years ago

reset

File size: 39.6 KB
Line 
1import unittest
2import re
3import Tkinter as tkinter
4from Tkinter import TclError
5from test.test_support import requires, run_unittest
6
7from test_ttk.support import pixels_conv, tcl_version, requires_tcl
8from widget_tests import AbstractWidgetTest, int_round
9
10requires('gui')
11
12
13class PackTest(AbstractWidgetTest, unittest.TestCase):
14
15    def create2(self):
16        pack = tkinter.Toplevel(self.root, name='pack')
17        pack.wm_geometry('300x200+0+0')
18        pack.wm_minsize(1, 1)
19        a = tkinter.Frame(pack, name='a', width=20, height=40, bg='red')
20        b = tkinter.Frame(pack, name='b', width=50, height=30, bg='blue')
21        c = tkinter.Frame(pack, name='c', width=80, height=80, bg='green')
22        d = tkinter.Frame(pack, name='d', width=40, height=30, bg='yellow')
23        return pack, a, b, c, d
24
25    def test_pack_configure_after(self):
26        pack, a, b, c, d = self.create2()
27        with self.assertRaisesRegexp(TclError, 'window "%s" isn\'t packed' % b):
28            a.pack_configure(after=b)
29        with self.assertRaisesRegexp(TclError, 'bad window path name ".foo"'):
30            a.pack_configure(after='.foo')
31        a.pack_configure(side='top')
32        b.pack_configure(side='top')
33        c.pack_configure(side='top')
34        d.pack_configure(side='top')
35        self.assertEqual(pack.pack_slaves(), [a, b, c, d])
36        a.pack_configure(after=b)
37        self.assertEqual(pack.pack_slaves(), [b, a, c, d])
38        a.pack_configure(after=a)
39        self.assertEqual(pack.pack_slaves(), [b, a, c, d])
40
41    def test_pack_configure_anchor(self):
42        pack, a, b, c, d = self.create2()
43        def check(anchor, geom):
44            a.pack_configure(side='top', ipadx=5, padx=10, ipady=15, pady=20,
45                             expand=True, anchor=anchor)
46            self.root.update()
47            self.assertEqual(a.winfo_geometry(), geom)
48        check('n', '30x70+135+20')
49        check('ne', '30x70+260+20')
50        check('e', '30x70+260+65')
51        check('se', '30x70+260+110')
52        check('s', '30x70+135+110')
53        check('sw', '30x70+10+110')
54        check('w', '30x70+10+65')
55        check('nw', '30x70+10+20')
56        check('center', '30x70+135+65')
57
58    def test_pack_configure_before(self):
59        pack, a, b, c, d = self.create2()
60        with self.assertRaisesRegexp(TclError, 'window "%s" isn\'t packed' % b):
61            a.pack_configure(before=b)
62        with self.assertRaisesRegexp(TclError, 'bad window path name ".foo"'):
63            a.pack_configure(before='.foo')
64        a.pack_configure(side='top')
65        b.pack_configure(side='top')
66        c.pack_configure(side='top')
67        d.pack_configure(side='top')
68        self.assertEqual(pack.pack_slaves(), [a, b, c, d])
69        a.pack_configure(before=d)
70        self.assertEqual(pack.pack_slaves(), [b, c, a, d])
71        a.pack_configure(before=a)
72        self.assertEqual(pack.pack_slaves(), [b, c, a, d])
73
74    def test_pack_configure_expand(self):
75        pack, a, b, c, d = self.create2()
76        def check(*geoms):
77            self.root.update()
78            self.assertEqual(a.winfo_geometry(), geoms[0])
79            self.assertEqual(b.winfo_geometry(), geoms[1])
80            self.assertEqual(c.winfo_geometry(), geoms[2])
81            self.assertEqual(d.winfo_geometry(), geoms[3])
82        a.pack_configure(side='left')
83        b.pack_configure(side='top')
84        c.pack_configure(side='right')
85        d.pack_configure(side='bottom')
86        check('20x40+0+80', '50x30+135+0', '80x80+220+75', '40x30+100+170')
87        a.pack_configure(side='left', expand='yes')
88        b.pack_configure(side='top', expand='on')
89        c.pack_configure(side='right', expand=True)
90        d.pack_configure(side='bottom', expand=1)
91        check('20x40+40+80', '50x30+175+35', '80x80+180+110', '40x30+100+135')
92        a.pack_configure(side='left', expand='yes', fill='both')
93        b.pack_configure(side='top', expand='on', fill='both')
94        c.pack_configure(side='right', expand=True, fill='both')
95        d.pack_configure(side='bottom', expand=1, fill='both')
96        check('100x200+0+0', '200x100+100+0', '160x100+140+100', '40x100+100+100')
97
98    def test_pack_configure_in(self):
99        pack, a, b, c, d = self.create2()
100        a.pack_configure(side='top')
101        b.pack_configure(side='top')
102        c.pack_configure(side='top')
103        d.pack_configure(side='top')
104        a.pack_configure(in_=pack)
105        self.assertEqual(pack.pack_slaves(), [b, c, d, a])
106        a.pack_configure(in_=c)
107        self.assertEqual(pack.pack_slaves(), [b, c, d])
108        self.assertEqual(c.pack_slaves(), [a])
109        with self.assertRaisesRegexp(TclError,
110                                     'can\'t pack %s inside itself' % (a,)):
111            a.pack_configure(in_=a)
112        with self.assertRaisesRegexp(TclError, 'bad window path name ".foo"'):
113            a.pack_configure(in_='.foo')
114
115    def test_pack_configure_padx_ipadx_fill(self):
116        pack, a, b, c, d = self.create2()
117        def check(geom1, geom2, **kwargs):
118            a.pack_forget()
119            b.pack_forget()
120            a.pack_configure(**kwargs)
121            b.pack_configure(expand=True, fill='both')
122            self.root.update()
123            self.assertEqual(a.winfo_geometry(), geom1)
124            self.assertEqual(b.winfo_geometry(), geom2)
125        check('20x40+260+80', '240x200+0+0', side='right', padx=20)
126        check('20x40+250+80', '240x200+0+0', side='right', padx=(10, 30))
127        check('60x40+240+80', '240x200+0+0', side='right', ipadx=20)
128        check('30x40+260+80', '250x200+0+0', side='right', ipadx=5, padx=10)
129        check('20x40+260+80', '240x200+0+0', side='right', padx=20, fill='x')
130        check('20x40+249+80', '240x200+0+0',
131              side='right', padx=(9, 31), fill='x')
132        check('60x40+240+80', '240x200+0+0', side='right', ipadx=20, fill='x')
133        check('30x40+260+80', '250x200+0+0',
134              side='right', ipadx=5, padx=10, fill='x')
135        check('30x40+255+80', '250x200+0+0',
136              side='right', ipadx=5, padx=(5, 15), fill='x')
137        check('20x40+140+0', '300x160+0+40', side='top', padx=20)
138        check('20x40+120+0', '300x160+0+40', side='top', padx=(0, 40))
139        check('60x40+120+0', '300x160+0+40', side='top', ipadx=20)
140        check('30x40+135+0', '300x160+0+40', side='top', ipadx=5, padx=10)
141        check('30x40+130+0', '300x160+0+40', side='top', ipadx=5, padx=(5, 15))
142        check('260x40+20+0', '300x160+0+40', side='top', padx=20, fill='x')
143        check('260x40+25+0', '300x160+0+40',
144              side='top', padx=(25, 15), fill='x')
145        check('300x40+0+0', '300x160+0+40', side='top', ipadx=20, fill='x')
146        check('280x40+10+0', '300x160+0+40',
147              side='top', ipadx=5, padx=10, fill='x')
148        check('280x40+5+0', '300x160+0+40',
149              side='top', ipadx=5, padx=(5, 15), fill='x')
150        a.pack_configure(padx='1c')
151        self.assertEqual(a.pack_info()['padx'],
152                         self._str(pack.winfo_pixels('1c')))
153        a.pack_configure(ipadx='1c')
154        self.assertEqual(a.pack_info()['ipadx'],
155                         self._str(pack.winfo_pixels('1c')))
156
157    def test_pack_configure_pady_ipady_fill(self):
158        pack, a, b, c, d = self.create2()
159        def check(geom1, geom2, **kwargs):
160            a.pack_forget()
161            b.pack_forget()
162            a.pack_configure(**kwargs)
163            b.pack_configure(expand=True, fill='both')
164            self.root.update()
165            self.assertEqual(a.winfo_geometry(), geom1)
166            self.assertEqual(b.winfo_geometry(), geom2)
167        check('20x40+280+80', '280x200+0+0', side='right', pady=20)
168        check('20x40+280+70', '280x200+0+0', side='right', pady=(10, 30))
169        check('20x80+280+60', '280x200+0+0', side='right', ipady=20)
170        check('20x50+280+75', '280x200+0+0', side='right', ipady=5, pady=10)
171        check('20x40+280+80', '280x200+0+0', side='right', pady=20, fill='x')
172        check('20x40+280+69', '280x200+0+0',
173              side='right', pady=(9, 31), fill='x')
174        check('20x80+280+60', '280x200+0+0', side='right', ipady=20, fill='x')
175        check('20x50+280+75', '280x200+0+0',
176              side='right', ipady=5, pady=10, fill='x')
177        check('20x50+280+70', '280x200+0+0',
178              side='right', ipady=5, pady=(5, 15), fill='x')
179        check('20x40+140+20', '300x120+0+80', side='top', pady=20)
180        check('20x40+140+0', '300x120+0+80', side='top', pady=(0, 40))
181        check('20x80+140+0', '300x120+0+80', side='top', ipady=20)
182        check('20x50+140+10', '300x130+0+70', side='top', ipady=5, pady=10)
183        check('20x50+140+5', '300x130+0+70', side='top', ipady=5, pady=(5, 15))
184        check('300x40+0+20', '300x120+0+80', side='top', pady=20, fill='x')
185        check('300x40+0+25', '300x120+0+80',
186              side='top', pady=(25, 15), fill='x')
187        check('300x80+0+0', '300x120+0+80', side='top', ipady=20, fill='x')
188        check('300x50+0+10', '300x130+0+70',
189              side='top', ipady=5, pady=10, fill='x')
190        check('300x50+0+5', '300x130+0+70',
191              side='top', ipady=5, pady=(5, 15), fill='x')
192        a.pack_configure(pady='1c')
193        self.assertEqual(a.pack_info()['pady'],
194                         self._str(pack.winfo_pixels('1c')))
195        a.pack_configure(ipady='1c')
196        self.assertEqual(a.pack_info()['ipady'],
197                         self._str(pack.winfo_pixels('1c')))
198
199    def test_pack_configure_side(self):
200        pack, a, b, c, d = self.create2()
201        def check(side, geom1, geom2):
202            a.pack_configure(side=side)
203            self.assertEqual(a.pack_info()['side'], side)
204            b.pack_configure(expand=True, fill='both')
205            self.root.update()
206            self.assertEqual(a.winfo_geometry(), geom1)
207            self.assertEqual(b.winfo_geometry(), geom2)
208        check('top', '20x40+140+0', '300x160+0+40')
209        check('bottom', '20x40+140+160', '300x160+0+0')
210        check('left', '20x40+0+80', '280x200+20+0')
211        check('right', '20x40+280+80', '280x200+0+0')
212
213    def test_pack_forget(self):
214        pack, a, b, c, d = self.create2()
215        a.pack_configure()
216        b.pack_configure()
217        c.pack_configure()
218        self.assertEqual(pack.pack_slaves(), [a, b, c])
219        b.pack_forget()
220        self.assertEqual(pack.pack_slaves(), [a, c])
221        b.pack_forget()
222        self.assertEqual(pack.pack_slaves(), [a, c])
223        d.pack_forget()
224
225    def test_pack_info(self):
226        pack, a, b, c, d = self.create2()
227        with self.assertRaisesRegexp(TclError, 'window "%s" isn\'t packed' % a):
228            a.pack_info()
229        a.pack_configure()
230        b.pack_configure(side='right', in_=a, anchor='s', expand=True, fill='x',
231                         ipadx=5, padx=10, ipady=2, pady=(5, 15))
232        info = a.pack_info()
233        self.assertIsInstance(info, dict)
234        self.assertEqual(info['anchor'], 'center')
235        self.assertEqual(info['expand'], self._str(0))
236        self.assertEqual(info['fill'], 'none')
237        self.assertEqual(info['in'], pack)
238        self.assertEqual(info['ipadx'], self._str(0))
239        self.assertEqual(info['ipady'], self._str(0))
240        self.assertEqual(info['padx'], self._str(0))
241        self.assertEqual(info['pady'], self._str(0))
242        self.assertEqual(info['side'], 'top')
243        info = b.pack_info()
244        self.assertIsInstance(info, dict)
245        self.assertEqual(info['anchor'], 's')
246        self.assertEqual(info['expand'], self._str(1))
247        self.assertEqual(info['fill'], 'x')
248        self.assertEqual(info['in'], a)
249        self.assertEqual(info['ipadx'], self._str(5))
250        self.assertEqual(info['ipady'], self._str(2))
251        self.assertEqual(info['padx'], self._str(10))
252        self.assertEqual(info['pady'], self._str((5, 15)))
253        self.assertEqual(info['side'], 'right')
254
255    def test_pack_propagate(self):
256        pack, a, b, c, d = self.create2()
257        pack.configure(width=300, height=200)
258        a.pack_configure()
259        pack.pack_propagate(False)
260        self.root.update()
261        self.assertEqual(pack.winfo_reqwidth(), 300)
262        self.assertEqual(pack.winfo_reqheight(), 200)
263        pack.pack_propagate(True)
264        self.root.update()
265        self.assertEqual(pack.winfo_reqwidth(), 20)
266        self.assertEqual(pack.winfo_reqheight(), 40)
267
268    def test_pack_slaves(self):
269        pack, a, b, c, d = self.create2()
270        self.assertEqual(pack.pack_slaves(), [])
271        a.pack_configure()
272        self.assertEqual(pack.pack_slaves(), [a])
273        b.pack_configure()
274        self.assertEqual(pack.pack_slaves(), [a, b])
275
276
277class PlaceTest(AbstractWidgetTest, unittest.TestCase):
278
279    def create2(self):
280        t = tkinter.Toplevel(self.root, width=300, height=200, bd=0)
281        t.wm_geometry('300x200+0+0')
282        f = tkinter.Frame(t, width=154, height=84, bd=2, relief='raised')
283        f.place_configure(x=48, y=38)
284        f2 = tkinter.Frame(t, width=30, height=60, bd=2, relief='raised')
285        self.root.update()
286        return t, f, f2
287
288    def test_place_configure_in(self):
289        t, f, f2 = self.create2()
290        self.assertEqual(f2.winfo_manager(), '')
291        with self.assertRaisesRegexp(TclError, "can't place %s relative to "
292                                     "itself" % re.escape(str(f2))):
293            f2.place_configure(in_=f2)
294        if tcl_version >= (8, 5):
295            self.assertEqual(f2.winfo_manager(), '')
296        with self.assertRaisesRegexp(TclError, 'bad window path name'):
297            f2.place_configure(in_='spam')
298        f2.place_configure(in_=f)
299        self.assertEqual(f2.winfo_manager(), 'place')
300
301    def test_place_configure_x(self):
302        t, f, f2 = self.create2()
303        f2.place_configure(in_=f)
304        self.assertEqual(f2.place_info()['x'], '0')
305        self.root.update()
306        self.assertEqual(f2.winfo_x(), 50)
307        f2.place_configure(x=100)
308        self.assertEqual(f2.place_info()['x'], '100')
309        self.root.update()
310        self.assertEqual(f2.winfo_x(), 150)
311        f2.place_configure(x=-10, relx=1)
312        self.assertEqual(f2.place_info()['x'], '-10')
313        self.root.update()
314        self.assertEqual(f2.winfo_x(), 190)
315        with self.assertRaisesRegexp(TclError, 'bad screen distance "spam"'):
316            f2.place_configure(in_=f, x='spam')
317
318    def test_place_configure_y(self):
319        t, f, f2 = self.create2()
320        f2.place_configure(in_=f)
321        self.assertEqual(f2.place_info()['y'], '0')
322        self.root.update()
323        self.assertEqual(f2.winfo_y(), 40)
324        f2.place_configure(y=50)
325        self.assertEqual(f2.place_info()['y'], '50')
326        self.root.update()
327        self.assertEqual(f2.winfo_y(), 90)
328        f2.place_configure(y=-10, rely=1)
329        self.assertEqual(f2.place_info()['y'], '-10')
330        self.root.update()
331        self.assertEqual(f2.winfo_y(), 110)
332        with self.assertRaisesRegexp(TclError, 'bad screen distance "spam"'):
333            f2.place_configure(in_=f, y='spam')
334
335    def test_place_configure_relx(self):
336        t, f, f2 = self.create2()
337        f2.place_configure(in_=f)
338        self.assertEqual(f2.place_info()['relx'], '0')
339        self.root.update()
340        self.assertEqual(f2.winfo_x(), 50)
341        f2.place_configure(relx=0.5)
342        self.assertEqual(f2.place_info()['relx'], '0.5')
343        self.root.update()
344        self.assertEqual(f2.winfo_x(), 125)
345        f2.place_configure(relx=1)
346        self.assertEqual(f2.place_info()['relx'], '1')
347        self.root.update()
348        self.assertEqual(f2.winfo_x(), 200)
349        with self.assertRaisesRegexp(TclError, 'expected floating-point number '
350                                     'but got "spam"'):
351            f2.place_configure(in_=f, relx='spam')
352
353    def test_place_configure_rely(self):
354        t, f, f2 = self.create2()
355        f2.place_configure(in_=f)
356        self.assertEqual(f2.place_info()['rely'], '0')
357        self.root.update()
358        self.assertEqual(f2.winfo_y(), 40)
359        f2.place_configure(rely=0.5)
360        self.assertEqual(f2.place_info()['rely'], '0.5')
361        self.root.update()
362        self.assertEqual(f2.winfo_y(), 80)
363        f2.place_configure(rely=1)
364        self.assertEqual(f2.place_info()['rely'], '1')
365        self.root.update()
366        self.assertEqual(f2.winfo_y(), 120)
367        with self.assertRaisesRegexp(TclError, 'expected floating-point number '
368                                     'but got "spam"'):
369            f2.place_configure(in_=f, rely='spam')
370
371    def test_place_configure_anchor(self):
372        f = tkinter.Frame(self.root)
373        with self.assertRaisesRegexp(TclError, 'bad anchor "j"'):
374            f.place_configure(anchor='j')
375        with self.assertRaisesRegexp(TclError, 'ambiguous anchor ""'):
376            f.place_configure(anchor='')
377        for value in 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw', 'center':
378            f.place_configure(anchor=value)
379            self.assertEqual(f.place_info()['anchor'], value)
380
381    def test_place_configure_width(self):
382        t, f, f2 = self.create2()
383        f2.place_configure(in_=f, width=120)
384        self.root.update()
385        self.assertEqual(f2.winfo_width(), 120)
386        f2.place_configure(width='')
387        self.root.update()
388        self.assertEqual(f2.winfo_width(), 30)
389        with self.assertRaisesRegexp(TclError, 'bad screen distance "abcd"'):
390            f2.place_configure(width='abcd')
391
392    def test_place_configure_height(self):
393        t, f, f2 = self.create2()
394        f2.place_configure(in_=f, height=120)
395        self.root.update()
396        self.assertEqual(f2.winfo_height(), 120)
397        f2.place_configure(height='')
398        self.root.update()
399        self.assertEqual(f2.winfo_height(), 60)
400        with self.assertRaisesRegexp(TclError, 'bad screen distance "abcd"'):
401            f2.place_configure(height='abcd')
402
403    def test_place_configure_relwidth(self):
404        t, f, f2 = self.create2()
405        f2.place_configure(in_=f, relwidth=0.5)
406        self.root.update()
407        self.assertEqual(f2.winfo_width(), 75)
408        f2.place_configure(relwidth='')
409        self.root.update()
410        self.assertEqual(f2.winfo_width(), 30)
411        with self.assertRaisesRegexp(TclError, 'expected floating-point number '
412                                     'but got "abcd"'):
413            f2.place_configure(relwidth='abcd')
414
415    def test_place_configure_relheight(self):
416        t, f, f2 = self.create2()
417        f2.place_configure(in_=f, relheight=0.5)
418        self.root.update()
419        self.assertEqual(f2.winfo_height(), 40)
420        f2.place_configure(relheight='')
421        self.root.update()
422        self.assertEqual(f2.winfo_height(), 60)
423        with self.assertRaisesRegexp(TclError, 'expected floating-point number '
424                                     'but got "abcd"'):
425            f2.place_configure(relheight='abcd')
426
427    def test_place_configure_bordermode(self):
428        f = tkinter.Frame(self.root)
429        with self.assertRaisesRegexp(TclError, 'bad bordermode "j"'):
430            f.place_configure(bordermode='j')
431        with self.assertRaisesRegexp(TclError, 'ambiguous bordermode ""'):
432            f.place_configure(bordermode='')
433        for value in 'inside', 'outside', 'ignore':
434            f.place_configure(bordermode=value)
435            self.assertEqual(f.place_info()['bordermode'], value)
436
437    def test_place_forget(self):
438        foo = tkinter.Frame(self.root)
439        foo.place_configure(width=50, height=50)
440        self.root.update()
441        foo.place_forget()
442        self.root.update()
443        self.assertFalse(foo.winfo_ismapped())
444        with self.assertRaises(TypeError):
445            foo.place_forget(0)
446
447    def test_place_info(self):
448        t, f, f2 = self.create2()
449        f2.place_configure(in_=f, x=1, y=2, width=3, height=4,
450                           relx=0.1, rely=0.2, relwidth=0.3, relheight=0.4,
451                           anchor='se', bordermode='outside')
452        info = f2.place_info()
453        self.assertIsInstance(info, dict)
454        self.assertEqual(info['x'], '1')
455        self.assertEqual(info['y'], '2')
456        self.assertEqual(info['width'], '3')
457        self.assertEqual(info['height'], '4')
458        self.assertEqual(info['relx'], '0.1')
459        self.assertEqual(info['rely'], '0.2')
460        self.assertEqual(info['relwidth'], '0.3')
461        self.assertEqual(info['relheight'], '0.4')
462        self.assertEqual(info['anchor'], 'se')
463        self.assertEqual(info['bordermode'], 'outside')
464        self.assertEqual(info['x'], '1')
465        self.assertEqual(info['x'], '1')
466        with self.assertRaises(TypeError):
467            f2.place_info(0)
468
469    def test_place_slaves(self):
470        foo = tkinter.Frame(self.root)
471        bar = tkinter.Frame(self.root)
472        self.assertEqual(foo.place_slaves(), [])
473        bar.place_configure(in_=foo)
474        self.assertEqual(foo.place_slaves(), [bar])
475        with self.assertRaises(TypeError):
476            foo.place_slaves(0)
477
478
479class GridTest(AbstractWidgetTest, unittest.TestCase):
480
481    def tearDown(self):
482        cols, rows = self.root.grid_size()
483        for i in range(cols + 1):
484            self.root.grid_columnconfigure(i, weight=0, minsize=0, pad=0, uniform='')
485        for i in range(rows + 1):
486            self.root.grid_rowconfigure(i, weight=0, minsize=0, pad=0, uniform='')
487        self.root.grid_propagate(1)
488        super(GridTest, self).tearDown()
489
490    def test_grid_configure(self):
491        b = tkinter.Button(self.root)
492        self.assertEqual(b.grid_info(), {})
493        b.grid_configure()
494        self.assertEqual(b.grid_info()['in'], self.root)
495        self.assertEqual(b.grid_info()['column'], self._str(0))
496        self.assertEqual(b.grid_info()['row'], self._str(0))
497        b.grid_configure({'column': 1}, row=2)
498        self.assertEqual(b.grid_info()['column'], self._str(1))
499        self.assertEqual(b.grid_info()['row'], self._str(2))
500
501    def test_grid_configure_column(self):
502        b = tkinter.Button(self.root)
503        with self.assertRaisesRegexp(TclError, 'bad column value "-1": '
504                                     'must be a non-negative integer'):
505            b.grid_configure(column=-1)
506        b.grid_configure(column=2)
507        self.assertEqual(b.grid_info()['column'], self._str(2))
508
509    def test_grid_configure_columnspan(self):
510        b = tkinter.Button(self.root)
511        with self.assertRaisesRegexp(TclError, 'bad columnspan value "0": '
512                                     'must be a positive integer'):
513            b.grid_configure(columnspan=0)
514        b.grid_configure(columnspan=2)
515        self.assertEqual(b.grid_info()['columnspan'], self._str(2))
516
517    def test_grid_configure_in(self):
518        f = tkinter.Frame(self.root)
519        b = tkinter.Button(self.root)
520        self.assertEqual(b.grid_info(), {})
521        b.grid_configure()
522        self.assertEqual(b.grid_info()['in'], self.root)
523        b.grid_configure(in_=f)
524        self.assertEqual(b.grid_info()['in'], f)
525        b.grid_configure({'in': self.root})
526        self.assertEqual(b.grid_info()['in'], self.root)
527
528    def test_grid_configure_ipadx(self):
529        b = tkinter.Button(self.root)
530        with self.assertRaisesRegexp(TclError, 'bad ipadx value "-1": '
531                                     'must be positive screen distance'):
532            b.grid_configure(ipadx=-1)
533        b.grid_configure(ipadx=1)
534        self.assertEqual(b.grid_info()['ipadx'], self._str(1))
535        b.grid_configure(ipadx='.5c')
536        self.assertEqual(b.grid_info()['ipadx'],
537                self._str(int_round(pixels_conv('.5c') * self.scaling)))
538
539    def test_grid_configure_ipady(self):
540        b = tkinter.Button(self.root)
541        with self.assertRaisesRegexp(TclError, 'bad ipady value "-1": '
542                                     'must be positive screen distance'):
543            b.grid_configure(ipady=-1)
544        b.grid_configure(ipady=1)
545        self.assertEqual(b.grid_info()['ipady'], self._str(1))
546        b.grid_configure(ipady='.5c')
547        self.assertEqual(b.grid_info()['ipady'],
548                self._str(int_round(pixels_conv('.5c') * self.scaling)))
549
550    def test_grid_configure_padx(self):
551        b = tkinter.Button(self.root)
552        with self.assertRaisesRegexp(TclError, 'bad pad value "-1": '
553                                     'must be positive screen distance'):
554            b.grid_configure(padx=-1)
555        b.grid_configure(padx=1)
556        self.assertEqual(b.grid_info()['padx'], self._str(1))
557        b.grid_configure(padx=(10, 5))
558        self.assertEqual(b.grid_info()['padx'], self._str((10, 5)))
559        b.grid_configure(padx='.5c')
560        self.assertEqual(b.grid_info()['padx'],
561                self._str(int_round(pixels_conv('.5c') * self.scaling)))
562
563    def test_grid_configure_pady(self):
564        b = tkinter.Button(self.root)
565        with self.assertRaisesRegexp(TclError, 'bad pad value "-1": '
566                                     'must be positive screen distance'):
567            b.grid_configure(pady=-1)
568        b.grid_configure(pady=1)
569        self.assertEqual(b.grid_info()['pady'], self._str(1))
570        b.grid_configure(pady=(10, 5))
571        self.assertEqual(b.grid_info()['pady'], self._str((10, 5)))
572        b.grid_configure(pady='.5c')
573        self.assertEqual(b.grid_info()['pady'],
574                self._str(int_round(pixels_conv('.5c') * self.scaling)))
575
576    def test_grid_configure_row(self):
577        b = tkinter.Button(self.root)
578        with self.assertRaisesRegexp(TclError, 'bad (row|grid) value "-1": '
579                                     'must be a non-negative integer'):
580            b.grid_configure(row=-1)
581        b.grid_configure(row=2)
582        self.assertEqual(b.grid_info()['row'], self._str(2))
583
584    def test_grid_configure_rownspan(self):
585        b = tkinter.Button(self.root)
586        with self.assertRaisesRegexp(TclError, 'bad rowspan value "0": '
587                                     'must be a positive integer'):
588            b.grid_configure(rowspan=0)
589        b.grid_configure(rowspan=2)
590        self.assertEqual(b.grid_info()['rowspan'], self._str(2))
591
592    def test_grid_configure_sticky(self):
593        f = tkinter.Frame(self.root, bg='red')
594        with self.assertRaisesRegexp(TclError, 'bad stickyness value "glue"'):
595            f.grid_configure(sticky='glue')
596        f.grid_configure(sticky='ne')
597        self.assertEqual(f.grid_info()['sticky'], 'ne')
598        f.grid_configure(sticky='n,s,e,w')
599        self.assertEqual(f.grid_info()['sticky'], 'nesw')
600
601    def test_grid_columnconfigure(self):
602        with self.assertRaises(TypeError):
603            self.root.grid_columnconfigure()
604        self.assertEqual(self.root.grid_columnconfigure(0),
605                         {'minsize': 0, 'pad': 0, 'uniform': None, 'weight': 0})
606        with self.assertRaisesRegexp(TclError, 'bad option "-foo"'):
607            self.root.grid_columnconfigure(0, 'foo')
608        self.root.grid_columnconfigure((0, 3), weight=2)
609        with self.assertRaisesRegexp(TclError,
610                                     'must specify a single element on retrieval'):
611            self.root.grid_columnconfigure((0, 3))
612        b = tkinter.Button(self.root)
613        b.grid_configure(column=0, row=0)
614        if tcl_version >= (8, 5):
615            self.root.grid_columnconfigure('all', weight=3)
616            with self.assertRaisesRegexp(TclError, 'expected integer but got "all"'):
617                self.root.grid_columnconfigure('all')
618            self.assertEqual(self.root.grid_columnconfigure(0, 'weight'), 3)
619        self.assertEqual(self.root.grid_columnconfigure(3, 'weight'), 2)
620        self.assertEqual(self.root.grid_columnconfigure(265, 'weight'), 0)
621        if tcl_version >= (8, 5):
622            self.root.grid_columnconfigure(b, weight=4)
623            self.assertEqual(self.root.grid_columnconfigure(0, 'weight'), 4)
624
625    def test_grid_columnconfigure_minsize(self):
626        with self.assertRaisesRegexp(TclError, 'bad screen distance "foo"'):
627            self.root.grid_columnconfigure(0, minsize='foo')
628        self.root.grid_columnconfigure(0, minsize=10)
629        self.assertEqual(self.root.grid_columnconfigure(0, 'minsize'), 10)
630        self.assertEqual(self.root.grid_columnconfigure(0)['minsize'], 10)
631
632    def test_grid_columnconfigure_weight(self):
633        with self.assertRaisesRegexp(TclError, 'expected integer but got "bad"'):
634            self.root.grid_columnconfigure(0, weight='bad')
635        with self.assertRaisesRegexp(TclError, 'invalid arg "-weight": '
636                                     'should be non-negative'):
637            self.root.grid_columnconfigure(0, weight=-3)
638        self.root.grid_columnconfigure(0, weight=3)
639        self.assertEqual(self.root.grid_columnconfigure(0, 'weight'), 3)
640        self.assertEqual(self.root.grid_columnconfigure(0)['weight'], 3)
641
642    def test_grid_columnconfigure_pad(self):
643        with self.assertRaisesRegexp(TclError, 'bad screen distance "foo"'):
644            self.root.grid_columnconfigure(0, pad='foo')
645        with self.assertRaisesRegexp(TclError, 'invalid arg "-pad": '
646                                     'should be non-negative'):
647            self.root.grid_columnconfigure(0, pad=-3)
648        self.root.grid_columnconfigure(0, pad=3)
649        self.assertEqual(self.root.grid_columnconfigure(0, 'pad'), 3)
650        self.assertEqual(self.root.grid_columnconfigure(0)['pad'], 3)
651
652    def test_grid_columnconfigure_uniform(self):
653        self.root.grid_columnconfigure(0, uniform='foo')
654        self.assertEqual(self.root.grid_columnconfigure(0, 'uniform'), 'foo')
655        self.assertEqual(self.root.grid_columnconfigure(0)['uniform'], 'foo')
656
657    def test_grid_rowconfigure(self):
658        with self.assertRaises(TypeError):
659            self.root.grid_rowconfigure()
660        self.assertEqual(self.root.grid_rowconfigure(0),
661                         {'minsize': 0, 'pad': 0, 'uniform': None, 'weight': 0})
662        with self.assertRaisesRegexp(TclError, 'bad option "-foo"'):
663            self.root.grid_rowconfigure(0, 'foo')
664        self.root.grid_rowconfigure((0, 3), weight=2)
665        with self.assertRaisesRegexp(TclError,
666                                     'must specify a single element on retrieval'):
667            self.root.grid_rowconfigure((0, 3))
668        b = tkinter.Button(self.root)
669        b.grid_configure(column=0, row=0)
670        if tcl_version >= (8, 5):
671            self.root.grid_rowconfigure('all', weight=3)
672            with self.assertRaisesRegexp(TclError, 'expected integer but got "all"'):
673                self.root.grid_rowconfigure('all')
674            self.assertEqual(self.root.grid_rowconfigure(0, 'weight'), 3)
675        self.assertEqual(self.root.grid_rowconfigure(3, 'weight'), 2)
676        self.assertEqual(self.root.grid_rowconfigure(265, 'weight'), 0)
677        if tcl_version >= (8, 5):
678            self.root.grid_rowconfigure(b, weight=4)
679            self.assertEqual(self.root.grid_rowconfigure(0, 'weight'), 4)
680
681    def test_grid_rowconfigure_minsize(self):
682        with self.assertRaisesRegexp(TclError, 'bad screen distance "foo"'):
683            self.root.grid_rowconfigure(0, minsize='foo')
684        self.root.grid_rowconfigure(0, minsize=10)
685        self.assertEqual(self.root.grid_rowconfigure(0, 'minsize'), 10)
686        self.assertEqual(self.root.grid_rowconfigure(0)['minsize'], 10)
687
688    def test_grid_rowconfigure_weight(self):
689        with self.assertRaisesRegexp(TclError, 'expected integer but got "bad"'):
690            self.root.grid_rowconfigure(0, weight='bad')
691        with self.assertRaisesRegexp(TclError, 'invalid arg "-weight": '
692                                     'should be non-negative'):
693            self.root.grid_rowconfigure(0, weight=-3)
694        self.root.grid_rowconfigure(0, weight=3)
695        self.assertEqual(self.root.grid_rowconfigure(0, 'weight'), 3)
696        self.assertEqual(self.root.grid_rowconfigure(0)['weight'], 3)
697
698    def test_grid_rowconfigure_pad(self):
699        with self.assertRaisesRegexp(TclError, 'bad screen distance "foo"'):
700            self.root.grid_rowconfigure(0, pad='foo')
701        with self.assertRaisesRegexp(TclError, 'invalid arg "-pad": '
702                                     'should be non-negative'):
703            self.root.grid_rowconfigure(0, pad=-3)
704        self.root.grid_rowconfigure(0, pad=3)
705        self.assertEqual(self.root.grid_rowconfigure(0, 'pad'), 3)
706        self.assertEqual(self.root.grid_rowconfigure(0)['pad'], 3)
707
708    def test_grid_rowconfigure_uniform(self):
709        self.root.grid_rowconfigure(0, uniform='foo')
710        self.assertEqual(self.root.grid_rowconfigure(0, 'uniform'), 'foo')
711        self.assertEqual(self.root.grid_rowconfigure(0)['uniform'], 'foo')
712
713    def test_grid_forget(self):
714        b = tkinter.Button(self.root)
715        c = tkinter.Button(self.root)
716        b.grid_configure(row=2, column=2, rowspan=2, columnspan=2,
717                         padx=3, pady=4, sticky='ns')
718        self.assertEqual(self.root.grid_slaves(), [b])
719        b.grid_forget()
720        c.grid_forget()
721        self.assertEqual(self.root.grid_slaves(), [])
722        self.assertEqual(b.grid_info(), {})
723        b.grid_configure(row=0, column=0)
724        info = b.grid_info()
725        self.assertEqual(info['row'], self._str(0))
726        self.assertEqual(info['column'], self._str(0))
727        self.assertEqual(info['rowspan'], self._str(1))
728        self.assertEqual(info['columnspan'], self._str(1))
729        self.assertEqual(info['padx'], self._str(0))
730        self.assertEqual(info['pady'], self._str(0))
731        self.assertEqual(info['sticky'], '')
732
733    def test_grid_remove(self):
734        b = tkinter.Button(self.root)
735        c = tkinter.Button(self.root)
736        b.grid_configure(row=2, column=2, rowspan=2, columnspan=2,
737                         padx=3, pady=4, sticky='ns')
738        self.assertEqual(self.root.grid_slaves(), [b])
739        b.grid_remove()
740        c.grid_remove()
741        self.assertEqual(self.root.grid_slaves(), [])
742        self.assertEqual(b.grid_info(), {})
743        b.grid_configure(row=0, column=0)
744        info = b.grid_info()
745        self.assertEqual(info['row'], self._str(0))
746        self.assertEqual(info['column'], self._str(0))
747        self.assertEqual(info['rowspan'], self._str(2))
748        self.assertEqual(info['columnspan'], self._str(2))
749        self.assertEqual(info['padx'], self._str(3))
750        self.assertEqual(info['pady'], self._str(4))
751        self.assertEqual(info['sticky'], 'ns')
752
753    def test_grid_info(self):
754        b = tkinter.Button(self.root)
755        self.assertEqual(b.grid_info(), {})
756        b.grid_configure(row=2, column=2, rowspan=2, columnspan=2,
757                         padx=3, pady=4, sticky='ns')
758        info = b.grid_info()
759        self.assertIsInstance(info, dict)
760        self.assertEqual(info['in'], self.root)
761        self.assertEqual(info['row'], self._str(2))
762        self.assertEqual(info['column'], self._str(2))
763        self.assertEqual(info['rowspan'], self._str(2))
764        self.assertEqual(info['columnspan'], self._str(2))
765        self.assertEqual(info['padx'], self._str(3))
766        self.assertEqual(info['pady'], self._str(4))
767        self.assertEqual(info['sticky'], 'ns')
768
769    def test_grid_bbox(self):
770        self.assertEqual(self.root.grid_bbox(), (0, 0, 0, 0))
771        self.assertEqual(self.root.grid_bbox(0, 0), (0, 0, 0, 0))
772        self.assertEqual(self.root.grid_bbox(0, 0, 1, 1), (0, 0, 0, 0))
773        with self.assertRaisesRegexp(TclError, 'expected integer but got "x"'):
774            self.root.grid_bbox('x', 0)
775        with self.assertRaisesRegexp(TclError, 'expected integer but got "x"'):
776            self.root.grid_bbox(0, 'x')
777        with self.assertRaisesRegexp(TclError, 'expected integer but got "x"'):
778            self.root.grid_bbox(0, 0, 'x', 0)
779        with self.assertRaisesRegexp(TclError, 'expected integer but got "x"'):
780            self.root.grid_bbox(0, 0, 0, 'x')
781        with self.assertRaises(TypeError):
782            self.root.grid_bbox(0, 0, 0, 0, 0)
783        t = self.root
784        # de-maximize
785        t.wm_geometry('1x1+0+0')
786        t.wm_geometry('')
787        f1 = tkinter.Frame(t, width=75, height=75, bg='red')
788        f2 = tkinter.Frame(t, width=90, height=90, bg='blue')
789        f1.grid_configure(row=0, column=0)
790        f2.grid_configure(row=1, column=1)
791        self.root.update()
792        self.assertEqual(t.grid_bbox(), (0, 0, 165, 165))
793        self.assertEqual(t.grid_bbox(0, 0), (0, 0, 75, 75))
794        self.assertEqual(t.grid_bbox(0, 0, 1, 1), (0, 0, 165, 165))
795        self.assertEqual(t.grid_bbox(1, 1), (75, 75, 90, 90))
796        self.assertEqual(t.grid_bbox(10, 10, 0, 0), (0, 0, 165, 165))
797        self.assertEqual(t.grid_bbox(-2, -2, -1, -1), (0, 0, 0, 0))
798        self.assertEqual(t.grid_bbox(10, 10, 12, 12), (165, 165, 0, 0))
799
800    def test_grid_location(self):
801        with self.assertRaises(TypeError):
802            self.root.grid_location()
803        with self.assertRaises(TypeError):
804            self.root.grid_location(0)
805        with self.assertRaises(TypeError):
806            self.root.grid_location(0, 0, 0)
807        with self.assertRaisesRegexp(TclError, 'bad screen distance "x"'):
808            self.root.grid_location('x', 'y')
809        with self.assertRaisesRegexp(TclError, 'bad screen distance "y"'):
810            self.root.grid_location('1c', 'y')
811        t = self.root
812        # de-maximize
813        t.wm_geometry('1x1+0+0')
814        t.wm_geometry('')
815        f = tkinter.Frame(t, width=200, height=100,
816                          highlightthickness=0, bg='red')
817        self.assertEqual(f.grid_location(10, 10), (-1, -1))
818        f.grid_configure()
819        self.root.update()
820        self.assertEqual(t.grid_location(-10, -10), (-1, -1))
821        self.assertEqual(t.grid_location(-10, 0), (-1, 0))
822        self.assertEqual(t.grid_location(-1, 0), (-1, 0))
823        self.assertEqual(t.grid_location(0, -10), (0, -1))
824        self.assertEqual(t.grid_location(0, -1), (0, -1))
825        self.assertEqual(t.grid_location(0, 0), (0, 0))
826        self.assertEqual(t.grid_location(200, 0), (0, 0))
827        self.assertEqual(t.grid_location(201, 0), (1, 0))
828        self.assertEqual(t.grid_location(0, 100), (0, 0))
829        self.assertEqual(t.grid_location(0, 101), (0, 1))
830        self.assertEqual(t.grid_location(201, 101), (1, 1))
831
832    def test_grid_propagate(self):
833        self.assertEqual(self.root.grid_propagate(), True)
834        with self.assertRaises(TypeError):
835            self.root.grid_propagate(False, False)
836        self.root.grid_propagate(False)
837        self.assertFalse(self.root.grid_propagate())
838        f = tkinter.Frame(self.root, width=100, height=100, bg='red')
839        f.grid_configure(row=0, column=0)
840        self.root.update()
841        self.assertEqual(f.winfo_width(), 100)
842        self.assertEqual(f.winfo_height(), 100)
843        f.grid_propagate(False)
844        g = tkinter.Frame(self.root, width=75, height=85, bg='green')
845        g.grid_configure(in_=f, row=0, column=0)
846        self.root.update()
847        self.assertEqual(f.winfo_width(), 100)
848        self.assertEqual(f.winfo_height(), 100)
849        f.grid_propagate(True)
850        self.root.update()
851        self.assertEqual(f.winfo_width(), 75)
852        self.assertEqual(f.winfo_height(), 85)
853
854    def test_grid_size(self):
855        with self.assertRaises(TypeError):
856            self.root.grid_size(0)
857        self.assertEqual(self.root.grid_size(), (0, 0))
858        f = tkinter.Scale(self.root)
859        f.grid_configure(row=0, column=0)
860        self.assertEqual(self.root.grid_size(), (1, 1))
861        f.grid_configure(row=4, column=5)
862        self.assertEqual(self.root.grid_size(), (6, 5))
863
864    def test_grid_slaves(self):
865        self.assertEqual(self.root.grid_slaves(), [])
866        a = tkinter.Label(self.root)
867        a.grid_configure(row=0, column=1)
868        b = tkinter.Label(self.root)
869        b.grid_configure(row=1, column=0)
870        c = tkinter.Label(self.root)
871        c.grid_configure(row=1, column=1)
872        d = tkinter.Label(self.root)
873        d.grid_configure(row=1, column=1)
874        self.assertEqual(self.root.grid_slaves(), [d, c, b, a])
875        self.assertEqual(self.root.grid_slaves(row=0), [a])
876        self.assertEqual(self.root.grid_slaves(row=1), [d, c, b])
877        self.assertEqual(self.root.grid_slaves(column=0), [b])
878        self.assertEqual(self.root.grid_slaves(column=1), [d, c, a])
879        self.assertEqual(self.root.grid_slaves(row=1, column=1), [d, c])
880
881
882tests_gui = (
883    PackTest, PlaceTest, GridTest,
884)
885
886if __name__ == '__main__':
887    run_unittest(*tests_gui)
Note: See TracBrowser for help on using the repository browser.