mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
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.
This commit is contained in:
commit
06e66108c6
6 changed files with 58 additions and 17 deletions
|
@ -391,6 +391,11 @@ class BooleanVar(Variable):
|
|||
"""
|
||||
Variable.__init__(self, master, value, name)
|
||||
|
||||
def set(self, value):
|
||||
"""Set the variable to VALUE."""
|
||||
return self._tk.globalsetvar(self._name, self._tk.getboolean(value))
|
||||
initialize = set
|
||||
|
||||
def get(self):
|
||||
"""Return the value of the variable as a bool."""
|
||||
try:
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
||||
class Var(Variable):
|
||||
|
@ -159,16 +160,41 @@ class TestBooleanVar(TestBase):
|
|||
|
||||
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()
|
||||
|
|
|
@ -573,7 +573,7 @@ class Widget(tkinter.Widget):
|
|||
if ret and callback:
|
||||
return callback(*args, **kw)
|
||||
|
||||
return bool(ret)
|
||||
return ret
|
||||
|
||||
|
||||
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")))
|
||||
return self.tk.getboolean(self.tk.call(self._w, "validate"))
|
||||
|
||||
|
||||
class Combobox(Entry):
|
||||
|
@ -1231,7 +1231,7 @@ class Treeview(Widget, tkinter.XView, tkinter.YView):
|
|||
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):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue