[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