如何测试使用Tkinter mainloop的Python代码?

时间:2014-12-11 18:45:57

标签: python testing tkinter

如何使用nosetests测试以下代码?

# GUI
try:
    # for Python2
    import Tkinter as tk
except ImportError:
    # for Python3
    import tkinter as tk


def main():
    root = tk.Tk()
    canvas = tk.Canvas(root, width=250, height=250)
    canvas.pack()
    root.bind('<B1-Motion>', lambda x: True)
    root.bind('<Button-1>', lambda x: True)
    root.mainloop()

当我呼叫main()时,主循环被执行。我该如何防止这种情况?

2 个答案:

答案 0 :(得分:0)

不是调用root.mainloop(),而是调用root.update()。这只会运行tk循环一次(因此任何未决事件将由您的应用程序调度和处理)。

然后,测试应用程序的行为就变成了一系列步骤:

root.event_generate('<B1-Motion>') # will generate a "fake" event <B1-Motion>
root.update()
# test that '<B1-Motion>' callback was correctly executed (by eg checking an expected state of you app
root.event_generate('<Button-1>')
root.update()
# test ....

请注意,您还可以通过调用直接调用按钮(就像单击按钮一样) button.invoke()

答案 1 :(得分:-1)

要停止运行mainloop(),你可以注释掉这一行,这将运行main()而不用Tkinter创建画布。

try:
    # for Python2
     import Tkinter as tk
except ImportError:
     # for Python3
    import tkinter as tk


def main():
    root = tk.Tk()
    canvas = tk.Canvas(root, width=250, height=250)
    canvas.pack()
    root.bind('<B1-Motion>', lambda x: True)
    root.bind('<Button-1>', lambda x: True)
    #root.mainloop() """#stops the line being run"""
main()

或在main()函数外部使用root.mainloop()并注释掉mainloop()

try:
    # for Python2
     import Tkinter as tk
except ImportError:
     # for Python3
    import tkinter as tk
def main():
    root = tk.Tk()
    canvas = tk.Canvas(root, width=250, height=250)
    canvas.pack()
    root.bind('<B1-Motion>', lambda x: True)
    root.bind('<Button-1>', lambda x: True)
main()
#root.mainloop()