summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_tcl.py15
-rw-r--r--Misc/NEWS4
-rw-r--r--Modules/_tkinter.c23
3 files changed, 36 insertions, 6 deletions
diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py
index d0251aa..ad62671 100644
--- a/Lib/test/test_tcl.py
+++ b/Lib/test/test_tcl.py
@@ -378,6 +378,21 @@ class TclTest(unittest.TestCase):
if tcl_version >= (8, 5):
check('2**64', True)
+ def test_booleans(self):
+ tcl = self.interp
+ def check(expr, expected):
+ result = tcl.call('expr', expr)
+ self.assertEqual(result, expected)
+ self.assertIsInstance(result, int)
+ check('true', True)
+ check('yes', True)
+ check('on', True)
+ check('false', False)
+ check('no', False)
+ check('off', False)
+ check('1 < 2', True)
+ check('1 > 2', False)
+
def test_passing_values(self):
def passValue(value):
return self.interp.call('set', '_', value)
diff --git a/Misc/NEWS b/Misc/NEWS
index 92e6da7..949bf3f 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -16,6 +16,8 @@ Core and Builtins
Library
-------
+- Issue #21526: Tkinter now supports new boolean type in Tcl 8.5.
+
- Issue #23836: Fix the faulthandler module to handle reentrant calls to
its signal handlers.
@@ -146,8 +148,6 @@ Library
- Issue #23252: Added support for writing ZIP files to unseekable streams.
-- Issue #21526: Tkinter now supports new boolean type in Tcl 8.5.
-
- Issue #23647: Increase impalib's MAXLINE to accommodate modern mailbox sizes.
- Issue #23539: If body is None, http.client.HTTPConnection.request now sets
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
index 4bced69..403cd71 100644
--- a/Modules/_tkinter.c
+++ b/Modules/_tkinter.c
@@ -998,6 +998,15 @@ AsObj(PyObject *value)
}
}
+static PyObject *
+fromBoolean(PyObject* tkapp, Tcl_Obj *value)
+{
+ int boolValue;
+ if (Tcl_GetBooleanFromObj(Tkapp_Interp(tkapp), value, &boolValue) == TCL_ERROR)
+ return Tkinter_Error(tkapp);
+ return PyBool_FromLong(boolValue);
+}
+
static PyObject*
FromObj(PyObject* tkapp, Tcl_Obj *value)
{
@@ -1011,10 +1020,7 @@ FromObj(PyObject* tkapp, Tcl_Obj *value)
if (value->typePtr == app->BooleanType ||
value->typePtr == app->OldBooleanType) {
- int boolValue;
- if (Tcl_GetBooleanFromObj(interp, value, &boolValue) == TCL_ERROR)
- return Tkinter_Error(tkapp);
- return PyBool_FromLong(boolValue);
+ return fromBoolean(tkapp, value);
}
if (value->typePtr == app->ByteArrayType) {
@@ -1069,6 +1075,15 @@ FromObj(PyObject* tkapp, Tcl_Obj *value)
Tcl_GetCharLength(value));
}
+#if TK_VERSION_HEX >= 0x08050000
+ if (app->BooleanType == NULL &&
+ strcmp(value->typePtr->name, "booleanString") == 0) {
+ /* booleanString type is not registered in Tcl */
+ app->BooleanType = value->typePtr;
+ return fromBoolean(tkapp, value);
+ }
+#endif
+
return newPyTclObject(value);
}