From bb70b2afe39ad4334a9f3449cddd28149bd628b6 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 25 Dec 2020 17:04:26 +0200 Subject: [PATCH] bpo-15303: Support widgets with boolean value False in Tkinter (GH-23904) Use `widget is None` instead of checking the boolean value of a widget. --- Lib/tkinter/__init__.py | 16 +++++++------- Lib/tkinter/commondialog.py | 2 +- Lib/tkinter/dnd.py | 22 +++++++++---------- Lib/tkinter/font.py | 6 ++--- Lib/tkinter/simpledialog.py | 4 ++-- Lib/tkinter/tix.py | 6 ++--- Lib/tkinter/ttk.py | 2 +- .../2020-12-21-22-59-26.bpo-15303.zozVrq.rst | 1 + 8 files changed, 30 insertions(+), 29 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-12-21-22-59-26.bpo-15303.zozVrq.rst diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index 1cc18704613..a32eb76d3b9 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -292,7 +292,7 @@ def _get_default_root(what=None): if not _support_default_root: raise RuntimeError("No master specified and tkinter is " "configured to not support default root") - if not _default_root: + if _default_root is None: if what: raise RuntimeError(f"Too early to {what}: no default root window") root = Tk() @@ -342,7 +342,7 @@ class Variable: if name is not None and not isinstance(name, str): raise TypeError("name must be a string") global _varnum - if not master: + if master is None: master = _get_default_root('create variable') self._root = master._root() self._tk = master.tk @@ -808,7 +808,7 @@ class Misc: function which shall be called. Additional parameters are given as parameters to the function call. Return identifier to cancel scheduling with after_cancel.""" - if not func: + if func is None: # I'd rather use time.sleep(ms*0.001) self.tk.call('after', ms) return None @@ -1542,7 +1542,7 @@ class Misc: def _root(self): """Internal function.""" w = self - while w.master: w = w.master + while w.master is not None: w = w.master return w _subst_format = ('%#', '%b', '%f', '%h', '%k', '%s', '%t', '%w', '%x', '%y', @@ -2306,7 +2306,7 @@ class Tk(Misc, Wm): self.tk.createcommand('exit', _exit) self._tclCommands.append('tkerror') self._tclCommands.append('exit') - if _support_default_root and not _default_root: + if _support_default_root and _default_root is None: _default_root = self self.protocol("WM_DELETE_WINDOW", self.destroy) @@ -2534,7 +2534,7 @@ class BaseWidget(Misc): def _setup(self, master, cnf): """Internal function. Sets up information about children.""" - if not master: + if master is None: master = _get_default_root() self.master = master self.tk = master.tk @@ -3949,7 +3949,7 @@ class _setit: def __call__(self, *args): self.__var.set(self.__value) - if self.__callback: + if self.__callback is not None: self.__callback(self.__value, *args) @@ -3998,7 +3998,7 @@ class Image: def __init__(self, imgtype, name=None, cnf={}, master=None, **kw): self.name = None - if not master: + if master is None: master = _get_default_root('create image') self.tk = getattr(master, 'tk', master) if not name: diff --git a/Lib/tkinter/commondialog.py b/Lib/tkinter/commondialog.py index cc3069842c3..12e42fe14ac 100644 --- a/Lib/tkinter/commondialog.py +++ b/Lib/tkinter/commondialog.py @@ -18,7 +18,7 @@ class Dialog: command = None def __init__(self, master=None, **options): - if not master: + if master is None: master = options.get('parent') self.master = master self.options = options diff --git a/Lib/tkinter/dnd.py b/Lib/tkinter/dnd.py index 3120ff342f8..acec61ba71f 100644 --- a/Lib/tkinter/dnd.py +++ b/Lib/tkinter/dnd.py @@ -108,7 +108,7 @@ __all__ = ["dnd_start", "DndHandler"] def dnd_start(source, event): h = DndHandler(source, event) - if h.root: + if h.root is not None: return h else: return None @@ -143,7 +143,7 @@ class DndHandler: def __del__(self): root = self.root self.root = None - if root: + if root is not None: try: del root.__dnd except AttributeError: @@ -154,25 +154,25 @@ class DndHandler: target_widget = self.initial_widget.winfo_containing(x, y) source = self.source new_target = None - while target_widget: + while target_widget is not None: try: attr = target_widget.dnd_accept except AttributeError: pass else: new_target = attr(source, event) - if new_target: + if new_target is not None: break target_widget = target_widget.master old_target = self.target if old_target is new_target: - if old_target: + if old_target is not None: old_target.dnd_motion(source, event) else: - if old_target: + if old_target is not None: self.target = None old_target.dnd_leave(source, event) - if new_target: + if new_target is not None: new_target.dnd_enter(source, event) self.target = new_target @@ -193,7 +193,7 @@ class DndHandler: self.initial_widget.unbind("") widget['cursor'] = self.save_cursor self.target = self.source = self.initial_widget = self.root = None - if target: + if target is not None: if commit: target.dnd_commit(source, event) else: @@ -215,9 +215,9 @@ class Icon: if canvas is self.canvas: self.canvas.coords(self.id, x, y) return - if self.canvas: + if self.canvas is not None: self.detach() - if not canvas: + if canvas is None: return label = tkinter.Label(canvas, text=self.name, borderwidth=2, relief="raised") @@ -229,7 +229,7 @@ class Icon: def detach(self): canvas = self.canvas - if not canvas: + if canvas is None: return id = self.id label = self.label diff --git a/Lib/tkinter/font.py b/Lib/tkinter/font.py index c051162bd29..7f6ba5a80fb 100644 --- a/Lib/tkinter/font.py +++ b/Lib/tkinter/font.py @@ -68,7 +68,7 @@ class Font: def __init__(self, root=None, font=None, name=None, exists=False, **options): - if not root: + if root is None: root = tkinter._get_default_root('use font') tk = getattr(root, 'tk', root) if font: @@ -183,7 +183,7 @@ class Font: def families(root=None, displayof=None): "Get font families (as a tuple)" - if not root: + if root is None: root = tkinter._get_default_root('use font.families()') args = () if displayof: @@ -193,7 +193,7 @@ def families(root=None, displayof=None): def names(root=None): "Get names of defined fonts (as a tuple)" - if not root: + if root is None: root = tkinter._get_default_root('use font.names()') return root.tk.splitlist(root.tk.call("font", "names")) diff --git a/Lib/tkinter/simpledialog.py b/Lib/tkinter/simpledialog.py index 638da87c876..d9762b1351a 100644 --- a/Lib/tkinter/simpledialog.py +++ b/Lib/tkinter/simpledialog.py @@ -99,7 +99,7 @@ class Dialog(Toplevel): title -- the dialog title ''' master = parent - if not master: + if master is None: master = _get_default_root('create dialog window') Toplevel.__init__(self, master) @@ -124,7 +124,7 @@ class Dialog(Toplevel): self.buttonbox() - if not self.initial_focus: + if self.initial_focus is None: self.initial_focus = self self.protocol("WM_DELETE_WINDOW", self.cancel) diff --git a/Lib/tkinter/tix.py b/Lib/tkinter/tix.py index ef1e7406bc1..7d240754036 100644 --- a/Lib/tkinter/tix.py +++ b/Lib/tkinter/tix.py @@ -386,7 +386,7 @@ class TixWidget(tkinter.Widget): self.tk.call(name, 'configure', '-' + option, value) # These are missing from Tkinter def image_create(self, imgtype, cnf={}, master=None, **kw): - if not master: + if master is None: master = self if kw and cnf: cnf = _cnfmerge((cnf, kw)) elif kw: cnf = kw @@ -467,7 +467,7 @@ class DisplayStyle: (multiple) Display Items""" def __init__(self, itemtype, cnf={}, *, master=None, **kw): - if not master: + if master is None: if 'refwindow' in kw: master = kw['refwindow'] elif 'refwindow' in cnf: @@ -862,7 +862,7 @@ class HList(TixWidget, XView, YView): return self.tk.call(self._w, 'add', entry, *self._options(cnf, kw)) def add_child(self, parent=None, cnf={}, **kw): - if not parent: + if parent is None: parent = '' return self.tk.call( self._w, 'addchild', parent, *self._options(cnf, kw)) diff --git a/Lib/tkinter/ttk.py b/Lib/tkinter/ttk.py index ab7aeb15e8f..b854235a626 100644 --- a/Lib/tkinter/ttk.py +++ b/Lib/tkinter/ttk.py @@ -569,7 +569,7 @@ class Widget(tkinter.Widget): matches statespec. statespec is expected to be a sequence.""" ret = self.tk.getboolean( self.tk.call(self._w, "instate", ' '.join(statespec))) - if ret and callback: + if ret and callback is not None: return callback(*args, **kw) return ret diff --git a/Misc/NEWS.d/next/Library/2020-12-21-22-59-26.bpo-15303.zozVrq.rst b/Misc/NEWS.d/next/Library/2020-12-21-22-59-26.bpo-15303.zozVrq.rst new file mode 100644 index 00000000000..5a7900aa909 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-21-22-59-26.bpo-15303.zozVrq.rst @@ -0,0 +1 @@ +:mod:`tkinter` supports now widgets with boolean value False.