self.root.update()
self.assertIs(self.root.focus_get(), b)
+ def test_focus_methods_unresolvable(self):
+ # The focus may be on a widget that tkinter did not create and so
+ # cannot map to an instance (e.g. a torn-off menu). The focus
+ # methods return None instead of raising KeyError (gh-88758).
+ menu = tkinter.Menu(self.root, tearoff=1)
+ menu.add_command(label='Hello')
+ tearoff = self.root.tk.call('tk::TearOffMenu', str(menu), 0, 0)
+ self.addCleanup(self.root.tk.call, 'destroy', tearoff)
+ self.root.update()
+ self.assertRaises(KeyError, self.root.nametowidget, tearoff)
+
+ self.root.tk.call('focus', '-force', tearoff)
+ self.root.update()
+ self.assertIsNone(self.root.focus_get())
+ self.assertIsNone(self.root.focus_displayof())
+
def test_grab(self):
f = tkinter.Frame(self.root)
f.pack()
the focus."""
name = self.tk.call('focus')
if name == 'none' or not name: return None
- return self._nametowidget(name)
+ try:
+ return self._nametowidget(name)
+ except KeyError:
+ return None
def focus_displayof(self):
"""Return the widget which has currently the focus on the
Return None if the application does not have the focus."""
name = self.tk.call('focus', '-displayof', self._w)
if name == 'none' or not name: return None
- return self._nametowidget(name)
+ try:
+ return self._nametowidget(name)
+ except KeyError:
+ return None
def focus_lastfor(self):
"""Return the widget which would have the focus if top level
for this widget gets the focus from the window manager."""
name = self.tk.call('focus', '-lastfor', self._w)
if name == 'none' or not name: return None
- return self._nametowidget(name)
+ try:
+ return self._nametowidget(name)
+ except KeyError:
+ return None
def tk_focusFollowsMouse(self):
"""The widget under mouse will get automatically focus. Can not
+ self._displayof(displayof) + (rootX, rootY)
name = self.tk.call(args)
if not name: return None
- return self._nametowidget(name)
+ try:
+ return self._nametowidget(name)
+ except KeyError:
+ return None
def winfo_depth(self):
"""Return the number of bits per pixel."""
--- /dev/null
+:meth:`!tkinter.Misc.focus_get`, :meth:`!focus_displayof`,
+:meth:`!focus_lastfor` and :meth:`!winfo_containing` now return ``None``
+instead of raising :exc:`KeyError` when the widget was not created by
+:mod:`tkinter` (for example a torn-off menu).