我正在编写一个tkinter小部件的单元测试,它是一个更大的应用程序的一部分。 我有一些与标签上的事件触发有关的问题,以断言回调执行。
请注意,检查按钮的回调时,我的测试代码效果很好。在这种情况下,我写了类似的东西:
a_button = self.sc._inner_frame.winfo_children()[2].winfo_children()[2]
a_button.invoke()
self.assertTrue(self.controller.add_sell_indicator.called)
它有效。
但是,对于标签,没有invoke()
方法,所以我按照event_generate()
使用:
label = self.sc._inner_frame.winfo_children()[0].winfo_children()[0]
label.event_generate("<Button-1>")
self.assertTrue(self.controller.get_selected_indicator.called)
但测试失败,因为事件<Button-1>
未被触发。
我在ipdb.set_trace()
之前和之后有点移动label.event_generate
。我注意到,只有当我在调用之前将其放入并按c
继续执行时,而不在解释器shell中触发任何其他命令,测试不会失败。
任何提示或解决方法?
答案 0 :(得分:0)
您可能需要使用warp
选项才能使鼠标悬停在窗口小部件上。如果光标不在窗口小部件上,则窗口小部件可能会检查忽略按钮事件。您可以在点击之前生成<Enter>
事件。
我记得当我在tcl / tk编写测试软件时必须做这些技巧,但我从来没有用Tkinter做过。我甚至不知道Tkinter是否支持warp
选项。您可能必须围绕核心tcl / tk事件生成命令编写自己的包装器。