Re: Simulating keystrokes in a tkinter unit test
alan moore <[email protected]> Thu, 1 Feb 2018 23:52:34 -0600
| Newsgroups | gmane.comp.python.tkinter |
|---|---|
| Message-ID | <[email protected]> |
Thanks. I managed to work it out. I think the problem was twofold: - I needed to call self.mywidget.focus_force(), because my test root wasn't getting focus - I needed to call self.root.update() before *and* after the key events This got it working. Thanks for your feedback! On 02/01/2018 04:35 PM, Bryan Oakley wrote: > You might need to also generate a <FocusIn> event and/or move the > mouse over the widget with the warp option (widget.event_generate(..., > warp=True), but you may need to also specify an x and y coordinate. I > don't remember). I think some widgets check to see if they have focus, > and will ignore keyboard events if they aren't focused. At least, I > vaguely recall having done that a decade or two ago when I tried > writing a tcl/tk testing harness. > > On Wed, Jan 31, 2018 at 12:09 PM, alan moore <[email protected] > <mailto:[email protected]>> wrote: > > Hi all, > > I'm attempting to write a unit test for a custom widget using > Python unittest. I'm trying to simulate actual keystrokes in my > unit test. > > Following the example from the tkinter test suite, I created a > test that is approximately this: > > from tkinter import Entry as MyWidget > from tkinter.test.support import AbstractTkTest > import unittest > > class TestMyWidget(AbstractTkTest, unittest.TestCase): > > def setUp(self): > super().setUp() > self.mywidget = self.create() > self.mywidget.wait_visibility() > > def tearDown(self): > super().tearDown() > self.mywidget.destroy() > > def create(self): > mw = MyWidget(self.root) > mw.pack() > return mw > > def _keystroke(self, char): > self.mywidget.event_generate('<KeyPress-{}>'.format(char)) > self.mywidget.event_generate('<KeyRelease-{}>'.format(char)) > self.mywidget.update_idletasks() > > def test_key_entry(self): > self._keystroke('a') > self.assertEqual(self.mywidget.get(), 'a') > > if __name__ == '__main__': > unittest.main() > > > This doesn't work, though. The keypresses don't register and > create any text in the entry. I can add text using event_generate > inside a mainloop, but without mainloop it doesn't seem to work. > > > Interestingly, I can use the same method to generate mouse events > and they seem to be recognized. Is there a way to make keypresses > work without mainloop? > > _______________________________________________ > Tkinter-discuss mailing list > [email protected] <mailto:[email protected]> > https://mail.python.org/mailman/listinfo/tkinter-discuss > <https://mail.python.org/mailman/listinfo/tkinter-discuss> > > _______________________________________________ Tkinter-discuss mailing list [email protected] https://mail.python.org/mailman/listinfo/tkinter-discuss