使用Tkinter事件测试问题

时间:2014-08-31 16:30:52

标签: python tkinter nose python-unittest

我正在编写一个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中触发任何其他命令,测试不会失败。

任何提示或解决方法?

1 个答案:

答案 0 :(得分:0)

您可能需要使用warp选项才能使鼠标悬停在窗口小部件上。如果光标不在窗口小部件上,则窗口小部件可能会检查忽略按钮事件。您可以在点击之前生成<Enter>事件。

我记得当我在tcl / tk编写测试软件时必须做这些技巧,但我从来没有用Tkinter做过。我甚至不知道Tkinter是否支持warp选项。您可能必须围绕核心tcl / tk事件生成命令编写自己的包装器。