【问题标题】:Testing issue with Tkinter eventTkinter 事件的测试问题
【发布时间】:2014-08-31 16:30:51
【问题描述】:

我正在为一个大型应用程序的一部分的 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)

但测试失败,因为没有触发事件&lt;Button-1&gt;

我在label.event_generate 之前和之后交替播放了ipdb.set_trace()。我注意到只有当我把它放在调用之前,然后按c 继续执行,没有在解释器 shell 中触发任何其他命令,测试才不会失败。

任何提示或解决方法?

【问题讨论】:

    标签: python tkinter nose python-unittest


    【解决方案1】:

    您可能需要使用warp 选项使鼠标悬停在小部件上。如果光标不在小部件上,那么小部件很可能会检查以忽略按钮事件。您可以在点击之前生成一个&lt;Enter&gt; 事件。

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

    【讨论】:

    • 感谢您的建议。 warp 选项存在,但不能解决问题。另外,我放一个set_trace的时候,其实label.event_generate("&lt;Button-1&gt;")并没有添加任何其他东西,但是事件并没有被触发。
    • 当调试器暂停执行时,你是否移动了鼠标,以便与调试器交互?
    • 不影响结果。当我继续执行测试通过时,我单击 shell 窗口或按 Alt+Tab
    • 我的错。为了避免this bug,我在测试设置中使用假MagicMock 压制update_idletasks()。显然,这会影响事件流,尽管它不会与仍然可以正常工作的 button.invoke() 混淆。出于好奇,只有当我在没有指定任何路径的情况下运行鼻子测试时才会出现该错误,但这是另一回事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    相关资源
    最近更新 更多