我想写一个需要读取tkinter var websocket = new WebSocket(URI);
的unittest。我没有走得很远。 unittest看起来像这样:
StringVar
输出如下:
def test_show_headers(self):
cell = common.winfo_path(self.FIRST_CELL, self.table)
print(cell)
# cell.setvar(cell['textvariable'], 'hello mum')
print(cell.getvar(cell['textvariable']))
第一个打印语句确认我有正确的tkinter小部件.table outer frame.scrolled canvas.table frame.r0c0
Error
Traceback (most recent call last):
File "E:\Stephenff\Programming\Study\Scratch\test_table_display.py", line 249, in test_show_headers
print(cell.getvar(cell['textvariable']))
File "D:\Python34\lib\tkinter\__init__.py", line 502, in getvar
return self.tk.getvar(name)
_tkinter.TclError: can't read "PY_VAR0": no such variable
,错误显示小部件具有正确的(.table … .r0c0)
标识符StringVar
,尽管它没有标识任何内容。
如果我取消注释"PY_VAR0"
行,则输出将更改为:
setvar
似乎很清楚.table outer frame.scrolled canvas.table frame.r0c0
hello mum
确定的价值在某处丢失了。让我感到困惑的是,"PY_VAR0"
已成功用于测试代码中以创建回调。该代码的简化版本如下所示:
getvar
这是一个原型,经过全面测试。回调正在运行,这意味着def _make_cell(self, parent, row_id, column_ix, cell_text):
tk_string = tk.StringVar()
cell = ttk.Entry(parent, name=self.cell_name(row_id, column_ix),
textvariable=tk_string)
cell.setvar(cell['textvariable'], cell_text)
cell.grid(row=row_id, column=column_ix)
cell.bind('<Return>',
(lambda event: self._cell_callback(
event, self.CellClicked(row_id, self.headers[column_ix]),
cell.getvar(cell['textvariable']))))
def _cell_callback(self, event=None, location=None, text=None):
self.cell_clicked = location
self.cell_text = text
self.parent.focus_set()
self.destroy()
方法中的相同getvar
语句正常运行。被测代码及其单元测试位于不同的模块中。
我在Russell Owen's notes ('Getting Information from Widgets')中找到了_make_cell
和setvar
。我知道在Lundh或Shipman中都没有提及getvar
和setvar
,尽管它们位于TckTk man页面中。这表明变量的名称空间由flags参数控制。我不太清楚Tcl是否足以知道这是否是我问题的原因。
更新1
在我注意到被测试代码的前两行可以重构之后,测试提供了正确的结果:
getvar
为:
tk_string = tk.StringVar()
cell = ttk.Entry(parent, name=self.cell_name(row_id, column_ix),
textvariable=tk_string)
之后,单元测试cell = ttk.Entry(parent, name=self.cell_name(row_id, column_ix),
textvariable=tk.StringVar())
产生正确的输出:
test_show_headers
然而,重构不应该能够产生这种变化。这怎么可能?为什么原始代码导致Tk的.table outer frame.scrolled canvas.table frame.r0c0
Date
迷路?
更新2
此程序中的任何位置都不使用线程。
我正在测试的类是ttk.Frame的子类,它依赖于外部提供的根窗口。对于测试,根窗口由unittest StringVar
方法提供,并在setUp
方法中删除。
tearDown
有三个测试夹具是从包含def setUp(self, withdraw=True):
self.parent = tk.Tk()
if withdraw:
self.parent.withdraw()
def tearDown(self):
self.parent.update()
self.parent.destroy()
和setUp
的公共基础子类化的。我已经确认所有三个实际上都调用了tearDown
。据我所知,通过阅读代码,只有一个tcl / tk解释器实例正在运行。