diff -r 027494c8ddaf Lib/test/test_tcl.py --- a/Lib/test/test_tcl.py Mon Jul 07 15:18:52 2014 +0300 +++ b/Lib/test/test_tcl.py Tue Jul 08 10:35:55 2014 +0300 @@ -166,7 +166,8 @@ tcl = self.interp.tk self.assertIs(tcl.getboolean('on'), True) self.assertIs(tcl.getboolean('1'), True) - self.assertEqual(tcl.getboolean(42), 42) + self.assertIs(tcl.getboolean(42), True) + self.assertIs(tcl.getboolean(0), False) self.assertRaises(TypeError, tcl.getboolean) self.assertRaises(TypeError, tcl.getboolean, 'on', '1') self.assertRaises(TypeError, tcl.getboolean, b'on') diff -r 027494c8ddaf Lib/tkinter/__init__.py --- a/Lib/tkinter/__init__.py Mon Jul 07 15:18:52 2014 +0300 +++ b/Lib/tkinter/__init__.py Tue Jul 08 10:35:55 2014 +0300 @@ -228,9 +228,11 @@ def __str__(self): """Return the name of the variable in Tcl.""" return self._name + def _sanitize(self, value): + return value def set(self, value): """Set the variable to VALUE.""" - return self._tk.globalsetvar(self._name, value) + return self._tk.globalsetvar(self._name, self._sanitize(value)) initialize = set def get(self): """Return value of variable.""" @@ -344,6 +346,9 @@ """ Variable.__init__(self, master, value, name) + def _sanitize(self, value): + return self._tk.getboolean(value) + def get(self): """Return the value of the variable as a bool.""" try: diff -r 027494c8ddaf Lib/tkinter/test/test_tkinter/test_variables.py --- a/Lib/tkinter/test/test_tkinter/test_variables.py Mon Jul 07 15:18:52 2014 +0300 +++ b/Lib/tkinter/test/test_tkinter/test_variables.py Tue Jul 08 10:35:55 2014 +0300 @@ -1,6 +1,7 @@ import unittest -from tkinter import Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tk +from tkinter import (Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tk, + TclError) class Var(Variable): @@ -159,16 +160,41 @@ def test_default(self): v = BooleanVar(self.root) - self.assertEqual(False, v.get()) + self.assertIs(v.get(), False) def test_get(self): v = BooleanVar(self.root, True, "name") - self.assertAlmostEqual(True, v.get()) + self.assertIs(v.get(), True) self.root.globalsetvar("name", "0") - self.assertAlmostEqual(False, v.get()) + self.assertIs(v.get(), False) + self.root.globalsetvar("name", 42 if self.root.wantobjects() else 1) + self.assertIs(v.get(), True) + self.root.globalsetvar("name", 0) + self.assertIs(v.get(), False) + self.root.globalsetvar("name", "on") + self.assertIs(v.get(), True) + + def test_set(self): + true = 1 if self.root.wantobjects() else "1" + false = 0 if self.root.wantobjects() else "0" + v = BooleanVar(self.root, name="name") + v.set(True) + self.assertEqual(self.root.globalgetvar("name"), true) + v.set("0") + self.assertEqual(self.root.globalgetvar("name"), false) + v.set(42) + self.assertEqual(self.root.globalgetvar("name"), true) + v.set(0) + self.assertEqual(self.root.globalgetvar("name"), false) + v.set("on") + self.assertEqual(self.root.globalgetvar("name"), true) def test_invalid_value_domain(self): + false = 0 if self.root.wantobjects() else "0" v = BooleanVar(self.root, name="name") + with self.assertRaises(TclError): + v.set("value") + self.assertEqual(self.root.globalgetvar("name"), false) self.root.globalsetvar("name", "value") with self.assertRaises(ValueError): v.get() diff -r 027494c8ddaf Lib/tkinter/ttk.py --- a/Lib/tkinter/ttk.py Mon Jul 07 15:18:52 2014 +0300 +++ b/Lib/tkinter/ttk.py Tue Jul 08 10:35:55 2014 +0300 @@ -582,7 +582,7 @@ if ret and callback: return callback(*args, **kw) - return bool(ret) + return ret def state(self, statespec=None): @@ -690,7 +690,7 @@ """Force revalidation, independent of the conditions specified by the validate option. Returns False if validation fails, True if it succeeds. Sets or clears the invalid state accordingly.""" - return bool(self.tk.getboolean(self.tk.call(self._w, "validate"))) + return self.tk.getboolean(self.tk.call(self._w, "validate")) class Combobox(Entry): @@ -1240,7 +1240,7 @@ def exists(self, item): """Returns True if the specified item is present in the tree, False otherwise.""" - return bool(self.tk.getboolean(self.tk.call(self._w, "exists", item))) + return self.tk.getboolean(self.tk.call(self._w, "exists", item)) def focus(self, item=None): diff -r 027494c8ddaf Modules/_tkinter.c --- a/Modules/_tkinter.c Mon Jul 07 15:18:52 2014 +0300 +++ b/Modules/_tkinter.c Tue Jul 08 10:35:55 2014 +0300 @@ -1733,15 +1733,21 @@ static PyObject * Tkapp_GetBoolean(PyObject *self, PyObject *args) { + PyObject *arg; char *s; int v; - if (PyTuple_Size(args) == 1) { - PyObject *o = PyTuple_GetItem(args, 0); - if (PyLong_Check(o)) { - Py_INCREF(o); - return o; - } + if (!PyArg_ParseTuple(args, "O:getboolean", &arg)) + return NULL; + if (PyLong_Check(arg)) { /* int or bool */ + return PyBool_FromLong(PyObject_IsTrue(arg)); + } + if (PyTclObject_Check(arg)) { + if (Tcl_GetBooleanFromObj(Tkapp_Interp(self), + ((PyTclObject*)arg)->value, + &v) == TCL_ERROR) + return Tkinter_Error(self); + return PyBool_FromLong(v); } if (!PyArg_ParseTuple(args, "s:getboolean", &s)) return NULL;