summaryrefslogtreecommitdiffstats
path: root/Lib/tkinter/test
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2020-12-25 18:19:20 (GMT)
committerGitHub <noreply@github.com>2020-12-25 18:19:20 (GMT)
commit675c97eb6c7c14c6a68ebf476c52931c1e5c1220 (patch)
treec79798eb94cff2cd416dc10ae4e127da85460a51 /Lib/tkinter/test
parent586f3dbe15139cafb2a6ffb82cea146906561844 (diff)
downloadcpython-675c97eb6c7c14c6a68ebf476c52931c1e5c1220.zip
cpython-675c97eb6c7c14c6a68ebf476c52931c1e5c1220.tar.gz
cpython-675c97eb6c7c14c6a68ebf476c52931c1e5c1220.tar.bz2
bpo-42721: Improve using simple dialogs without root window (GH-23897)
When simple query dialogs (tkinter.simpledialog), message boxes (tkinter.messagebox) or color choose dialog (tkinter.colorchooser) are created without arguments master and parent, and the default root window is not yet created, a new temporary hidden root window will be created automatically. It will not be set as the default root window and will be destroyed right after closing the dialog window. It will help to use these simple dialog windows in programs which do not need other GUI. Previously, message boxes and color chooser created the blank root window and left it after closing the dialog window, and query dialogs just raised an exception. Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
Diffstat (limited to 'Lib/tkinter/test')
-rw-r--r--Lib/tkinter/test/test_tkinter/test_colorchooser.py39
-rw-r--r--Lib/tkinter/test/test_tkinter/test_messagebox.py38
-rw-r--r--Lib/tkinter/test/test_tkinter/test_simpledialog.py24
3 files changed, 95 insertions, 6 deletions
diff --git a/Lib/tkinter/test/test_tkinter/test_colorchooser.py b/Lib/tkinter/test/test_tkinter/test_colorchooser.py
new file mode 100644
index 0000000..600c8cd
--- /dev/null
+++ b/Lib/tkinter/test/test_tkinter/test_colorchooser.py
@@ -0,0 +1,39 @@
+import unittest
+import tkinter
+from test.support import requires, run_unittest, swap_attr
+from tkinter.test.support import AbstractDefaultRootTest
+from tkinter.commondialog import Dialog
+from tkinter.colorchooser import askcolor
+
+requires('gui')
+
+
+class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase):
+
+ def test_askcolor(self):
+ def test_callback(dialog, master):
+ nonlocal ismapped
+ master.update()
+ ismapped = master.winfo_ismapped()
+ raise ZeroDivisionError
+
+ with swap_attr(Dialog, '_test_callback', test_callback):
+ ismapped = None
+ self.assertRaises(ZeroDivisionError, askcolor)
+ #askcolor()
+ self.assertEqual(ismapped, False)
+
+ root = tkinter.Tk()
+ ismapped = None
+ self.assertRaises(ZeroDivisionError, askcolor)
+ self.assertEqual(ismapped, True)
+ root.destroy()
+
+ tkinter.NoDefaultRoot()
+ self.assertRaises(RuntimeError, askcolor)
+
+
+tests_gui = (DefaultRootTest,)
+
+if __name__ == "__main__":
+ run_unittest(*tests_gui)
diff --git a/Lib/tkinter/test/test_tkinter/test_messagebox.py b/Lib/tkinter/test/test_tkinter/test_messagebox.py
new file mode 100644
index 0000000..0dec08e
--- /dev/null
+++ b/Lib/tkinter/test/test_tkinter/test_messagebox.py
@@ -0,0 +1,38 @@
+import unittest
+import tkinter
+from test.support import requires, run_unittest, swap_attr
+from tkinter.test.support import AbstractDefaultRootTest
+from tkinter.commondialog import Dialog
+from tkinter.messagebox import showinfo
+
+requires('gui')
+
+
+class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase):
+
+ def test_showinfo(self):
+ def test_callback(dialog, master):
+ nonlocal ismapped
+ master.update()
+ ismapped = master.winfo_ismapped()
+ raise ZeroDivisionError
+
+ with swap_attr(Dialog, '_test_callback', test_callback):
+ ismapped = None
+ self.assertRaises(ZeroDivisionError, showinfo, "Spam", "Egg Information")
+ self.assertEqual(ismapped, False)
+
+ root = tkinter.Tk()
+ ismapped = None
+ self.assertRaises(ZeroDivisionError, showinfo, "Spam", "Egg Information")
+ self.assertEqual(ismapped, True)
+ root.destroy()
+
+ tkinter.NoDefaultRoot()
+ self.assertRaises(RuntimeError, showinfo, "Spam", "Egg Information")
+
+
+tests_gui = (DefaultRootTest,)
+
+if __name__ == "__main__":
+ run_unittest(*tests_gui)
diff --git a/Lib/tkinter/test/test_tkinter/test_simpledialog.py b/Lib/tkinter/test/test_tkinter/test_simpledialog.py
index 9119172..b64b854 100644
--- a/Lib/tkinter/test/test_tkinter/test_simpledialog.py
+++ b/Lib/tkinter/test/test_tkinter/test_simpledialog.py
@@ -10,13 +10,25 @@ requires('gui')
class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase):
def test_askinteger(self):
- self.assertRaises(RuntimeError, askinteger, "Go To Line", "Line number")
- root = tkinter.Tk()
- with swap_attr(Dialog, 'wait_window', lambda self, w: w.destroy()):
+ @staticmethod
+ def mock_wait_window(w):
+ nonlocal ismapped
+ ismapped = w.master.winfo_ismapped()
+ w.destroy()
+
+ with swap_attr(Dialog, 'wait_window', mock_wait_window):
+ ismapped = None
+ askinteger("Go To Line", "Line number")
+ self.assertEqual(ismapped, False)
+
+ root = tkinter.Tk()
+ ismapped = None
askinteger("Go To Line", "Line number")
- root.destroy()
- tkinter.NoDefaultRoot()
- self.assertRaises(RuntimeError, askinteger, "Go To Line", "Line number")
+ self.assertEqual(ismapped, True)
+ root.destroy()
+
+ tkinter.NoDefaultRoot()
+ self.assertRaises(RuntimeError, askinteger, "Go To Line", "Line number")
tests_gui = (DefaultRootTest,)