Tkinter单元测试调用invoke()后检测按钮存在性失败如何修复?
Tkinter单元测试按钮识别问题修复方案
问题根因
你代码里存在2个核心错误导致测试失败:
- 按钮实例赋值逻辑错误:Tkinter的布局方法
pack()/grid()/place()没有返回值,你直接在创建按钮时链式调用pack(),会导致self.button1、self.button2被赋值为None,自然无法识别按钮对象、调用invoke()方法 - 自定义Frame未完成布局:你实例化
MyGUI之后没有调用布局方法,Frame本身没有被挂载到根窗口,内部的所有控件默认都不会被渲染
修复步骤
- 拆分按钮创建和布局操作:先给
self.button1、self.button2赋值按钮实例,再单独调用pack()方法完成布局 - 实例化
MyGUI后调用pack()将Frame挂载到根窗口 - (可选)如果你的
command/command2逻辑里有销毁窗口/控件的操作,测试前需要先校验按钮存在性,再触发点击,避免点击后控件消失导致断言失败
修复后完整代码
import tkinter as tkinter import unittest from tkinter import * from main import command, command2 class MyGUI(tkinter.Frame): def __init__(self, master, **kw): super().__init__(master, **kw) var = IntVar() Radiobutton(self, text='Легкая', variable=var, value=0).pack() Radiobutton(self, text='Нормальная', variable=var, value=1).pack() Radiobutton(self, text='Сложная', variable=var, value=2).pack() # 拆分实例赋值和布局调用 self.button1 = Button(self, text="Играть", command=lambda: command()) self.button1.pack() self.button2 = Button(self, text="Выйти", command=lambda: command2()) self.button2.pack() class TKinterTestCase(unittest.TestCase): def setUp(self): self.root = tkinter.Tk() # 隐藏测试过程弹出的窗口,为可选优化项 self.root.withdraw() def tearDown(self): if self.root: self.root.destroy() def test_enter1(self): v = MyGUI(self.root) # 把Frame挂载到根窗口 v.pack() # 若需验证点击后按钮仍然存在,可将断言放在invoke()之后 self.assertTrue(v.button1.winfo_ismapped()) v.button1.invoke() def test_enter2(self): v = MyGUI(self.root) v.pack() self.assertTrue(v.button2.winfo_ismapped()) v.button2.invoke() if __name__ == "__main__": unittest.main()
内容的提问来源于stack exchange,提问作者Eugene Saitamovich
相关产品推荐
相关产品推荐

