cpython: 38747f32fa7b (original) (raw)
Mercurial > cpython
changeset 95439:38747f32fa7b
Issue #15133: _tkinter.tkapp.getboolean() now supports Tcl_Obj and always returns bool. tkinter.BooleanVar now validates input values (accepted bool, int, str, and Tcl_Obj). tkinter.BooleanVar.get() now always returns bool. [#15133]
Serhiy Storchaka storchaka@gmail.com | |
---|---|
date | Sat, 04 Apr 2015 12:44:30 +0300 |
parents | ea94f6c87f5d(current diff)117f45749359(diff) |
children | 47a61a1c97b3 |
files | Lib/test/test_tcl.py Lib/tkinter/__init__.py Misc/NEWS Modules/_tkinter.c |
diffstat | 6 files changed, 58 insertions(+), 17 deletions(-)[+] [-] Lib/test/test_tcl.py 3 Lib/tkinter/__init__.py 5 Lib/tkinter/test/test_tkinter/test_variables.py 34 Lib/tkinter/ttk.py 6 Misc/NEWS 4 Modules/_tkinter.c 23 |
line wrap: on
line diff
--- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -179,7 +179,8 @@ class TclTest(unittest.TestCase): tcl = self.interp.tk self.assertIs(tcl.getboolean('on'), True) self.assertIs(tcl.getboolean('1'), True)
self.assertEqual(tcl.getboolean(42), 42)[](#l1.7)
self.assertIs(tcl.getboolean(42), True)[](#l1.8)
self.assertIs(tcl.getboolean(0), False)[](#l1.9) self.assertRaises(TypeError, tcl.getboolean)[](#l1.10) self.assertRaises(TypeError, tcl.getboolean, 'on', '1')[](#l1.11) self.assertRaises(TypeError, tcl.getboolean, b'on')[](#l1.12)
--- a/Lib/tkinter/init.py +++ b/Lib/tkinter/init.py @@ -391,6 +391,11 @@ class BooleanVar(Variable): """ Variable.init(self, master, value, name)
- def set(self, value):
"""Set the variable to VALUE."""[](#l2.8)
return self._tk.globalsetvar(self._name, self._tk.getboolean(value))[](#l2.9)
- initialize = set
+ def get(self): """Return the value of the variable as a bool.""" try:
--- a/Lib/tkinter/test/test_tkinter/test_variables.py +++ b/Lib/tkinter/test/test_tkinter/test_variables.py @@ -1,6 +1,7 @@ import unittest -from tkinter import Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tcl +from tkinter import (Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tcl,
TclError)[](#l3.8)
class Var(Variable): @@ -159,16 +160,41 @@ class TestBooleanVar(TestBase): def test_default(self): v = BooleanVar(self.root)
self.assertEqual(False, v.get())[](#l3.16)
self.assertIs(v.get(), False)[](#l3.17)
def test_get(self): v = BooleanVar(self.root, True, "name")
self.assertAlmostEqual(True, v.get())[](#l3.21)
self.assertIs(v.get(), True)[](#l3.22) self.root.globalsetvar("name", "0")[](#l3.23)
self.assertAlmostEqual(False, v.get())[](#l3.24)
self.assertIs(v.get(), False)[](#l3.25)
self.root.globalsetvar("name", 42 if self.root.wantobjects() else 1)[](#l3.26)
self.assertIs(v.get(), True)[](#l3.27)
self.root.globalsetvar("name", 0)[](#l3.28)
self.assertIs(v.get(), False)[](#l3.29)
self.root.globalsetvar("name", "on")[](#l3.30)
self.assertIs(v.get(), True)[](#l3.31)
- def test_set(self):
true = 1 if self.root.wantobjects() else "1"[](#l3.34)
false = 0 if self.root.wantobjects() else "0"[](#l3.35)
v = BooleanVar(self.root, name="name")[](#l3.36)
v.set(True)[](#l3.37)
self.assertEqual(self.root.globalgetvar("name"), true)[](#l3.38)
v.set("0")[](#l3.39)
self.assertEqual(self.root.globalgetvar("name"), false)[](#l3.40)
v.set(42)[](#l3.41)
self.assertEqual(self.root.globalgetvar("name"), true)[](#l3.42)
v.set(0)[](#l3.43)
self.assertEqual(self.root.globalgetvar("name"), false)[](#l3.44)
v.set("on")[](#l3.45)
self.assertEqual(self.root.globalgetvar("name"), true)[](#l3.46)
def test_invalid_value_domain(self):
false = 0 if self.root.wantobjects() else "0"[](#l3.49) v = BooleanVar(self.root, name="name")[](#l3.50)
with self.assertRaises(TclError):[](#l3.51)
v.set("value")[](#l3.52)
self.assertEqual(self.root.globalgetvar("name"), false)[](#l3.53) self.root.globalsetvar("name", "value")[](#l3.54) with self.assertRaises(ValueError):[](#l3.55) v.get()[](#l3.56)
--- a/Lib/tkinter/ttk.py +++ b/Lib/tkinter/ttk.py @@ -573,7 +573,7 @@ class Widget(tkinter.Widget): if ret and callback: return callback(*args, **kw)
return bool(ret)[](#l4.7)
return ret[](#l4.8)
def state(self, statespec=None): @@ -681,7 +681,7 @@ class Entry(Widget, tkinter.Entry): """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")))[](#l4.16)
return self.tk.getboolean(self.tk.call(self._w, "validate"))[](#l4.17)
class Combobox(Entry): @@ -1231,7 +1231,7 @@ class Treeview(Widget, tkinter.XView, tk 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)))[](#l4.25)
return self.tk.getboolean(self.tk.call(self._w, "exists", item))[](#l4.26)
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -19,6 +19,10 @@ Core and Builtins Library ------- +- Issue #15133: _tkinter.tkapp.getboolean() now supports Tcl_Obj and always
- returns bool. tkinter.BooleanVar now validates input values (accepted bool,
- int, str, and Tcl_Obj). tkinter.BooleanVar.get() now always returns bool. +
- Issue #10590: xml.sax.parseString() now supports string argument.
- Issue #23338: Fixed formatting ctypes error messages on Cygwin.
--- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -1934,19 +1934,24 @@ Tkapp_GetDouble(PyObject *self, PyObject } static PyObject * -Tkapp_GetBoolean(PyObject *self, PyObject *args) +Tkapp_GetBoolean(PyObject *self, PyObject *arg) { char *s; int v;
- if (PyTuple_Size(args) == 1) {
PyObject *o = PyTuple_GetItem(args, 0);[](#l6.14)
if (PyLong_Check(o)) {[](#l6.15)
Py_INCREF(o);[](#l6.16)
return o;[](#l6.17)
}[](#l6.18)
- if (PyTclObject_Check(arg)) {
if (Tcl_GetBooleanFromObj(Tkapp_Interp(self),[](#l6.25)
((PyTclObject*)arg)->value,[](#l6.26)
&v) == TCL_ERROR)[](#l6.27)
return Tkinter_Error(self);[](#l6.28)
return PyBool_FromLong(v);[](#l6.29)
- }
- if (!PyArg_Parse(arg, "s:getboolean", &s)) return NULL; CHECK_STRING_LENGTH(s); if (Tcl_GetBoolean(Tkapp_Interp(self), s, &v) == TCL_ERROR) @@ -2862,7 +2867,7 @@ static PyMethodDef Tkapp_methods[] = {"globalunsetvar", Tkapp_GlobalUnsetVar, METH_VARARGS}, {"getint", Tkapp_GetInt, METH_VARARGS}, {"getdouble", Tkapp_GetDouble, METH_VARARGS},