diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index d9c3f1bd7dd..bd3283caadb 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -177,6 +177,10 @@ Added methods :meth:`~tkinter.Spinbox.selection_from`, in the :class:`tkinter.Spinbox` class. (Contributed by Juliette Monsel in :issue:`34829`.) +Added method :meth:`~tkinter.Canvas.moveto` +in the :class:`tkinter.Canvas` class. +(Contributed by Juliette Monsel in :issue:`23831`.) + venv ---- diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index fa015ff12e0..1dc41188451 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -2914,6 +2914,15 @@ class Canvas(Widget, XView, YView): """Move an item TAGORID given in ARGS.""" self.tk.call((self._w, 'move') + args) + def moveto(self, tagOrId, x='', y=''): + """Move the items given by TAGORID in the canvas coordinate + space so that the first coordinate pair of the bottommost + item with tag TAGORID is located at position (X,Y). + X and Y may be the empty string, in which case the + corresponding coordinate will be unchanged. All items matching + TAGORID remain in the same positions relative to each other.""" + self.tk.call(self._w, 'moveto', tagOrId, x, y) + def postscript(self, cnf={}, **kw): """Print the contents of the canvas to a postscript file. Valid options: colormap, colormode, file, fontmap, diff --git a/Lib/tkinter/test/test_tkinter/test_widgets.py b/Lib/tkinter/test/test_tkinter/test_widgets.py index c068a9de2d7..12a0fbeeeee 100644 --- a/Lib/tkinter/test/test_tkinter/test_widgets.py +++ b/Lib/tkinter/test/test_tkinter/test_widgets.py @@ -745,6 +745,29 @@ class CanvasTest(AbstractWidgetTest, unittest.TestCase): self.checkPixelsParam(widget, 'yscrollincrement', 10, 0, 11.2, 13.6, -10, '0.1i') + @requires_tcl(8, 6) + def test_moveto(self): + widget = self.create() + i1 = widget.create_rectangle(1, 1, 20, 20, tags='group') + i2 = widget.create_rectangle(30, 30, 50, 70, tags='group') + x1, y1, _, _ = widget.bbox(i1) + x2, y2, _, _ = widget.bbox(i2) + widget.moveto('group', 200, 100) + x1_2, y1_2, _, _ = widget.bbox(i1) + x2_2, y2_2, _, _ = widget.bbox(i2) + self.assertEqual(x1_2, 200) + self.assertEqual(y1_2, 100) + self.assertEqual(x2 - x1, x2_2 - x1_2) + self.assertEqual(y2 - y1, y2_2 - y1_2) + widget.tag_lower(i2, i1) + widget.moveto('group', y=50) + x1_3, y1_3, _, _ = widget.bbox(i1) + x2_3, y2_3, _, _ = widget.bbox(i2) + self.assertEqual(y2_3, 50) + self.assertEqual(x2_3, x2_2) + self.assertEqual(x2_2 - x1_2, x2_3 - x1_3) + self.assertEqual(y2_2 - y1_2, y2_3 - y1_3) + @add_standard_options(IntegerSizeTests, StandardOptionsTests) class ListboxTest(AbstractWidgetTest, unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2018-10-09-15-44-04.bpo-23831.2CL7lL.rst b/Misc/NEWS.d/next/Library/2018-10-09-15-44-04.bpo-23831.2CL7lL.rst new file mode 100644 index 00000000000..de12407b4ff --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-10-09-15-44-04.bpo-23831.2CL7lL.rst @@ -0,0 +1,2 @@ +Add ``moveto()`` method to the ``tkinter.Canvas`` widget. Patch by Juliette +Monsel.