[Python-checkins] r66128 - in sandbox/trunk/ttk-gsoc/src: 2.x/test/test_other_widgets.py 2.x/ttk.py 3.x/test/test_other_widgets.py 3.x/ttk.py
guilherme.polo
python-checkins at python.org
Tue Sep 2 01:14:19 CEST 2008
Author: guilherme.polo
Date: Tue Sep 2 01:14:19 2008
New Revision: 66128
Log:
Panedwindow.forget works again;
Fixed custom Scale.configure so it works when Tkinter calls it through
__setitem__;
Tests added for the Scale and Panedwindow widgets.
Modified:
sandbox/trunk/ttk-gsoc/src/2.x/test/test_other_widgets.py
sandbox/trunk/ttk-gsoc/src/2.x/ttk.py
sandbox/trunk/ttk-gsoc/src/3.x/test/test_other_widgets.py
sandbox/trunk/ttk-gsoc/src/3.x/ttk.py
Modified: sandbox/trunk/ttk-gsoc/src/2.x/test/test_other_widgets.py
==============================================================================
--- sandbox/trunk/ttk-gsoc/src/2.x/test/test_other_widgets.py (original)
+++ sandbox/trunk/ttk-gsoc/src/2.x/test/test_other_widgets.py Tue Sep 2 01:14:19 2008
@@ -279,9 +279,203 @@
self.failUnlessEqual(self.entry.state(), ())
+class PanedwindowTest(unittest.TestCase):
+
+ def setUp(self):
+ self.paned = ttk.Panedwindow()
+
+ def tearDown(self):
+ self.paned.destroy()
+
+
+ def test_add(self):
+ # attempt to add a child that is not a direct child of the paned window
+ label = ttk.Label(self.paned)
+ child = ttk.Label(label)
+ self.failUnlessRaises(Tkinter.TclError, self.paned.add, child)
+ label.destroy()
+ child.destroy()
+ # another attempt
+ label = ttk.Label()
+ child = ttk.Label(label)
+ self.failUnlessRaises(Tkinter.TclError, self.paned.add, child)
+ child.destroy()
+ label.destroy()
+
+ good_child = ttk.Label()
+ self.paned.add(good_child)
+ # re-adding a child is not accepted
+ self.failUnlessRaises(Tkinter.TclError, self.paned.add, good_child)
+
+ other_child = ttk.Label(self.paned)
+ self.paned.add(other_child)
+ self.failUnlessEqual(self.paned.pane(0), self.paned.pane(1))
+ self.failUnlessRaises(Tkinter.TclError, self.paned.pane, 2)
+ good_child.destroy()
+ other_child.destroy()
+ self.failUnlessRaises(Tkinter.TclError, self.paned.pane, 0)
+
+
+ def test_forget(self):
+ self.failUnlessRaises(Tkinter.TclError, self.paned.forget, None)
+ self.failUnlessRaises(Tkinter.TclError, self.paned.forget, 0)
+
+ self.paned.add(ttk.Label())
+ self.paned.forget(0)
+ self.failUnlessRaises(Tkinter.TclError, self.paned.forget, 0)
+
+
+ def test_insert(self):
+ self.failUnlessRaises(Tkinter.TclError, self.paned.insert, None, 0)
+ self.failUnlessRaises(Tkinter.TclError, self.paned.insert, 0, None)
+ self.failUnlessRaises(Tkinter.TclError, self.paned.insert, 0, 0)
+
+ child = ttk.Label()
+ child2 = ttk.Label()
+ child3 = ttk.Label()
+
+ self.failUnlessRaises(Tkinter.TclError, self.paned.insert, 0, child)
+
+ self.paned.insert('end', child2)
+ self.paned.insert(0, child)
+ self.failUnlessEqual(self.paned.panes(), (str(child), str(child2)))
+
+ self.paned.insert(0, child2)
+ self.failUnlessEqual(self.paned.panes(), (str(child2), str(child)))
+
+ self.paned.insert('end', child3)
+ self.failUnlessEqual(self.paned.panes(),
+ (str(child2), str(child), str(child3)))
+
+ # reinserting a child should move it to its current position
+ panes = self.paned.panes()
+ self.paned.insert('end', child3)
+ self.failUnlessEqual(panes, self.paned.panes())
+
+ # moving child3 to child2 position should result in child2 ending up
+ # in previous child position and child ending up in previous child3
+ # position
+ self.paned.insert(child2, child3)
+ self.failUnlessEqual(self.paned.panes(),
+ (str(child3), str(child2), str(child)))
+
+
+ def test_pane(self):
+ self.failUnlessRaises(Tkinter.TclError, self.paned.pane, 0)
+
+ child = ttk.Label()
+ self.paned.add(child)
+ self.failUnless(isinstance(self.paned.pane(0), dict))
+ self.failUnlessEqual(self.paned.pane(0, weight=None), 0)
+ self.failUnlessEqual(self.paned.pane(0), self.paned.pane(str(child)))
+
+ self.failUnlessRaises(Tkinter.TclError, self.paned.pane, 0,
+ badoption='somevalue')
+
+
+ def test_sashpos(self):
+ self.failUnlessRaises(Tkinter.TclError, self.paned.sashpos, None)
+ self.failUnlessRaises(Tkinter.TclError, self.paned.sashpos, '')
+ self.failUnlessRaises(Tkinter.TclError, self.paned.sashpos, 0)
+
+ child = ttk.Label(self.paned, text='a')
+ self.paned.add(child, weight=1)
+ self.failUnlessRaises(Tkinter.TclError, self.paned.sashpos, 0)
+ child2 = ttk.Label(self.paned, text='b')
+ self.paned.add(child2)
+ self.failUnlessRaises(Tkinter.TclError, self.paned.sashpos, 1)
+
+ self.paned.pack(expand=True, fill='both')
+ self.paned.wait_visibility()
+
+ curr_pos = self.paned.sashpos(0)
+ self.paned.sashpos(0, 1000)
+ self.failUnless(curr_pos != self.paned.sashpos(0))
+ self.failUnless(isinstance(self.paned.sashpos(0), int))
+
+
+class RadiobuttonTest(unittest.TestCase): pass
+
+
+class ScaleTest(unittest.TestCase):
+
+ def setUp(self):
+ self.scale = ttk.Scale()
+ self.scale.pack()
+ self.scale.update()
+
+ def tearDown(self):
+ self.scale.destroy()
+
+
+ def test_custom_event(self):
+ failure = [1, 1, 1] # will need to be empty
+ def cb_test(event):
+ failure.pop()
+
+ funcid = self.scale.bind('<<RangeChanged>>', cb_test)
+
+ self.scale['from'] = 10
+ self.scale['from_'] = 10
+ self.scale['to'] = 3
+
+ self.failIf(failure)
+
+ failure = [1, 1, 1]
+ self.scale.configure(from_=2, to=5)
+ self.scale.configure(from_=0, to=-2)
+ self.scale.configure(to=10)
+
+ self.failIf(failure)
+
+
+ def test_get(self):
+ scale_width = self.scale.winfo_width()
+ self.failUnlessEqual(self.scale.get(scale_width, 0), self.scale['to'])
+
+ self.failUnlessEqual(self.scale.get(0, 0), self.scale['from'])
+ self.failUnlessEqual(self.scale.get(), self.scale['value'])
+ self.scale['value'] = 30
+ self.failUnlessEqual(self.scale.get(), self.scale['value'])
+
+ self.failUnlessRaises(Tkinter.TclError, self.scale.get, '', 0)
+ self.failUnlessRaises(Tkinter.TclError, self.scale.get, 0, '')
+
+
+ def test_set(self):
+ # set restricts the max/min values according to the current range
+ max = self.scale['to']
+ new_max = max + 10
+ self.scale.set(new_max)
+ self.failUnlessEqual(self.scale.get(), max)
+ min = self.scale['from']
+ self.scale.set(min - 1)
+ self.failUnlessEqual(self.scale.get(), min)
+
+ # changing directly the variable doesn't impose this limitation tho
+ var = Tkinter.DoubleVar()
+ self.scale['variable'] = var
+ var.set(max + 5)
+ self.failUnlessEqual(self.scale.get(), var.get())
+ self.failUnlessEqual(self.scale.get(), max + 5)
+ del var
+
+ # the same happens with the value option
+ self.scale['value'] = max + 10
+ self.failUnlessEqual(self.scale.get(), max + 10)
+ self.failUnlessEqual(self.scale.get(), self.scale['value'])
+
+ # nevertheless, note that the max/min values we can get specifying
+ # x, y coords are the ones according to the current range
+ self.failUnlessEqual(self.scale.get(0, 0), min)
+ self.failUnlessEqual(self.scale.get(self.scale.winfo_width(), 0), max)
+
+ self.failUnlessRaises(Tkinter.TclError, self.scale.set, None)
+
+
def test_main():
- support.run(WidgetTest, ButtonTest, #CheckbuttonTest,
- ComboboxTest, EntryTest)
+ support.run(WidgetTest, ButtonTest, #CheckbuttonTest, RadiobuttonTest,
+ ComboboxTest, EntryTest, PanedwindowTest, ScaleTest)
if __name__ == "__main__":
test_main()
Modified: sandbox/trunk/ttk-gsoc/src/2.x/ttk.py
==============================================================================
--- sandbox/trunk/ttk-gsoc/src/2.x/ttk.py (original)
+++ sandbox/trunk/ttk-gsoc/src/2.x/ttk.py Tue Sep 2 01:14:19 2008
@@ -12,7 +12,7 @@
of the widgets appearance lies at Themes.
"""
-__version__ = "0.2.3"
+__version__ = "0.2.4"
__author__ = "Guilherme Polo <ggpolo at gmail.com>"
@@ -955,6 +955,9 @@
Widget.__init__(self, master, "ttk::panedwindow", kw)
+ forget = Tkinter.PanedWindow.forget # overrides Pack.forget
+
+
def insert(self, pos, child, **kw):
"""Inserts a pane at the specified positions.
@@ -1075,11 +1078,13 @@
Widget.__init__(self, master, "ttk::scale", kw)
- def configure(self, **kw):
+ def configure(self, cnf=None, **kw):
"""Modify or query scale options.
- Changing "from", "from_" or "to" options generates a
- <<RangeChanged>> event."""
+ Setting a value for any of the "from", "from_" or "to" options
+ generates a <<RangeChanged>> event."""
+ if cnf:
+ kw.update(cnf)
Widget.configure(self, **kw)
if any(['from' in kw, 'from_' in kw, 'to' in kw]):
self.event_generate('<<RangeChanged>>')
Modified: sandbox/trunk/ttk-gsoc/src/3.x/test/test_other_widgets.py
==============================================================================
--- sandbox/trunk/ttk-gsoc/src/3.x/test/test_other_widgets.py (original)
+++ sandbox/trunk/ttk-gsoc/src/3.x/test/test_other_widgets.py Tue Sep 2 01:14:19 2008
@@ -279,9 +279,203 @@
self.failUnlessEqual(self.entry.state(), ())
+class PanedwindowTest(unittest.TestCase):
+
+ def setUp(self):
+ self.paned = ttk.Panedwindow()
+
+ def tearDown(self):
+ self.paned.destroy()
+
+
+ def test_add(self):
+ # attempt to add a child that is not a direct child of the paned window
+ label = ttk.Label(self.paned)
+ child = ttk.Label(label)
+ self.failUnlessRaises(tkinter.TclError, self.paned.add, child)
+ label.destroy()
+ child.destroy()
+ # another attempt
+ label = ttk.Label()
+ child = ttk.Label(label)
+ self.failUnlessRaises(tkinter.TclError, self.paned.add, child)
+ child.destroy()
+ label.destroy()
+
+ good_child = ttk.Label()
+ self.paned.add(good_child)
+ # re-adding a child is not accepted
+ self.failUnlessRaises(tkinter.TclError, self.paned.add, good_child)
+
+ other_child = ttk.Label(self.paned)
+ self.paned.add(other_child)
+ self.failUnlessEqual(self.paned.pane(0), self.paned.pane(1))
+ self.failUnlessRaises(tkinter.TclError, self.paned.pane, 2)
+ good_child.destroy()
+ other_child.destroy()
+ self.failUnlessRaises(tkinter.TclError, self.paned.pane, 0)
+
+
+ def test_forget(self):
+ self.failUnlessRaises(tkinter.TclError, self.paned.forget, None)
+ self.failUnlessRaises(tkinter.TclError, self.paned.forget, 0)
+
+ self.paned.add(ttk.Label())
+ self.paned.forget(0)
+ self.failUnlessRaises(tkinter.TclError, self.paned.forget, 0)
+
+
+ def test_insert(self):
+ self.failUnlessRaises(tkinter.TclError, self.paned.insert, None, 0)
+ self.failUnlessRaises(tkinter.TclError, self.paned.insert, 0, None)
+ self.failUnlessRaises(tkinter.TclError, self.paned.insert, 0, 0)
+
+ child = ttk.Label()
+ child2 = ttk.Label()
+ child3 = ttk.Label()
+
+ self.failUnlessRaises(tkinter.TclError, self.paned.insert, 0, child)
+
+ self.paned.insert('end', child2)
+ self.paned.insert(0, child)
+ self.failUnlessEqual(self.paned.panes(), (str(child), str(child2)))
+
+ self.paned.insert(0, child2)
+ self.failUnlessEqual(self.paned.panes(), (str(child2), str(child)))
+
+ self.paned.insert('end', child3)
+ self.failUnlessEqual(self.paned.panes(),
+ (str(child2), str(child), str(child3)))
+
+ # reinserting a child should move it to its current position
+ panes = self.paned.panes()
+ self.paned.insert('end', child3)
+ self.failUnlessEqual(panes, self.paned.panes())
+
+ # moving child3 to child2 position should result in child2 ending up
+ # in previous child position and child ending up in previous child3
+ # position
+ self.paned.insert(child2, child3)
+ self.failUnlessEqual(self.paned.panes(),
+ (str(child3), str(child2), str(child)))
+
+
+ def test_pane(self):
+ self.failUnlessRaises(tkinter.TclError, self.paned.pane, 0)
+
+ child = ttk.Label()
+ self.paned.add(child)
+ self.failUnless(isinstance(self.paned.pane(0), dict))
+ self.failUnlessEqual(self.paned.pane(0, weight=None), 0)
+ self.failUnlessEqual(self.paned.pane(0), self.paned.pane(str(child)))
+
+ self.failUnlessRaises(tkinter.TclError, self.paned.pane, 0,
+ badoption='somevalue')
+
+
+ def test_sashpos(self):
+ self.failUnlessRaises(tkinter.TclError, self.paned.sashpos, None)
+ self.failUnlessRaises(tkinter.TclError, self.paned.sashpos, '')
+ self.failUnlessRaises(tkinter.TclError, self.paned.sashpos, 0)
+
+ child = ttk.Label(self.paned, text='a')
+ self.paned.add(child, weight=1)
+ self.failUnlessRaises(tkinter.TclError, self.paned.sashpos, 0)
+ child2 = ttk.Label(self.paned, text='b')
+ self.paned.add(child2)
+ self.failUnlessRaises(tkinter.TclError, self.paned.sashpos, 1)
+
+ self.paned.pack(expand=True, fill='both')
+ self.paned.wait_visibility()
+
+ curr_pos = self.paned.sashpos(0)
+ self.paned.sashpos(0, 1000)
+ self.failUnless(curr_pos != self.paned.sashpos(0))
+ self.failUnless(isinstance(self.paned.sashpos(0), int))
+
+
+class RadiobuttonTest(unittest.TestCase): pass
+
+
+class ScaleTest(unittest.TestCase):
+
+ def setUp(self):
+ self.scale = ttk.Scale()
+ self.scale.pack()
+ self.scale.update()
+
+ def tearDown(self):
+ self.scale.destroy()
+
+
+ def test_custom_event(self):
+ failure = [1, 1, 1] # will need to be empty
+ def cb_test(event):
+ failure.pop()
+
+ funcid = self.scale.bind('<<RangeChanged>>', cb_test)
+
+ self.scale['from'] = 10
+ self.scale['from_'] = 10
+ self.scale['to'] = 3
+
+ self.failIf(failure)
+
+ failure = [1, 1, 1]
+ self.scale.configure(from_=2, to=5)
+ self.scale.configure(from_=0, to=-2)
+ self.scale.configure(to=10)
+
+ self.failIf(failure)
+
+
+ def test_get(self):
+ scale_width = self.scale.winfo_width()
+ self.failUnlessEqual(self.scale.get(scale_width, 0), self.scale['to'])
+
+ self.failUnlessEqual(self.scale.get(0, 0), self.scale['from'])
+ self.failUnlessEqual(self.scale.get(), self.scale['value'])
+ self.scale['value'] = 30
+ self.failUnlessEqual(self.scale.get(), self.scale['value'])
+
+ self.failUnlessRaises(tkinter.TclError, self.scale.get, '', 0)
+ self.failUnlessRaises(tkinter.TclError, self.scale.get, 0, '')
+
+
+ def test_set(self):
+ # set restricts the max/min values according to the current range
+ max = self.scale['to']
+ new_max = max + 10
+ self.scale.set(new_max)
+ self.failUnlessEqual(self.scale.get(), max)
+ min = self.scale['from']
+ self.scale.set(min - 1)
+ self.failUnlessEqual(self.scale.get(), min)
+
+ # changing directly the variable doesn't impose this limitation tho
+ var = tkinter.DoubleVar()
+ self.scale['variable'] = var
+ var.set(max + 5)
+ self.failUnlessEqual(self.scale.get(), var.get())
+ self.failUnlessEqual(self.scale.get(), max + 5)
+ del var
+
+ # the same happens with the value option
+ self.scale['value'] = max + 10
+ self.failUnlessEqual(self.scale.get(), max + 10)
+ self.failUnlessEqual(self.scale.get(), self.scale['value'])
+
+ # nevertheless, note that the max/min values we can get specifying
+ # x, y coords are the ones according to the current range
+ self.failUnlessEqual(self.scale.get(0, 0), min)
+ self.failUnlessEqual(self.scale.get(self.scale.winfo_width(), 0), max)
+
+ self.failUnlessRaises(tkinter.TclError, self.scale.set, None)
+
+
def test_main():
- support.run(WidgetTest, ButtonTest, #CheckbuttonTest,
- ComboboxTest, EntryTest)
+ support.run(WidgetTest, ButtonTest, #CheckbuttonTest, RadiobuttonTest,
+ ComboboxTest, EntryTest, PanedwindowTest, ScaleTest)
if __name__ == "__main__":
test_main()
Modified: sandbox/trunk/ttk-gsoc/src/3.x/ttk.py
==============================================================================
--- sandbox/trunk/ttk-gsoc/src/3.x/ttk.py (original)
+++ sandbox/trunk/ttk-gsoc/src/3.x/ttk.py Tue Sep 2 01:14:19 2008
@@ -12,7 +12,7 @@
of the widgets appearance lies at Themes.
"""
-__version__ = "0.2.3"
+__version__ = "0.2.4"
__author__ = "Guilherme Polo <ggpolo at gmail.com>"
@@ -955,6 +955,9 @@
Widget.__init__(self, master, "ttk::panedwindow", kw)
+ forget = tkinter.PanedWindow.forget # overrides Pack.forget
+
+
def insert(self, pos, child, **kw):
"""Inserts a pane at the specified positions.
@@ -1075,11 +1078,13 @@
Widget.__init__(self, master, "ttk::scale", kw)
- def configure(self, **kw):
+ def configure(self, cnf=None, **kw):
"""Modify or query scale options.
- Changing "from", "from_" or "to" options generates a
- <<RangeChanged>> event."""
+ Setting a value for any of the "from", "from_" or "to" options
+ generates a <<RangeChanged>> event."""
+ if cnf:
+ kw.update(cnf)
Widget.configure(self, **kw)
if any(['from' in kw, 'from_' in kw, 'to' in kw]):
self.event_generate('<<RangeChanged>>')
More information about the Python-checkins
mailing list