当代码在设置和获取`StringVar`时没有问题时,为什么不能在单元代码中获得Tk`BtringVar`?

时间:2015-06-07 13:04:57

标签: python-3.x tkinter tk ttk

我想写一个需要读取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_cellsetvar。我知道在Lundh或Shipman中都没有提及getvarsetvar,尽管它们位于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解释器实例正在运行。

0 个答案:

没有答案