Tkinter create_line 问题:坐标数量错误:期望偶数个
这是我第一次提问,我正在做一个基本的日志播放器,数据来自一个文本文件:
代码大概是这样的:
for aircraft in self.logArray.itervalues():
for logLine in aircraft:
currentPoint = self.point(logLine[1], logLine[2])
currentPoint = self.win2canvas(currentPoint)
points = np.append(points, currentPoint)
print points
print np.size(points)
self.canvas.create_line(points)
points = np.array([])
这里的 logArray 是一个字典,每个名字对应一个数组,数组的格式是 [时间, x, y],所以每个飞机的名字都会有这样一个数组。
第二个循环只是把坐标转换成 tkinter 画布的坐标,并把当前点添加到已经存在的(并且已经初始化的)数组中。
当我调用 create_line 方法时,我遇到了这个问题:
File "/home/joao/tese/workspace/ATC/src/autoATC/LogPlayer.py", line 131, in drawPath
self.canvas.create_line(points)
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 2204, in create_line
return self._create('line', args, kw)
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 2192, in _create
*(args + self._options(cnf, kw))))
_tkinter.TclError: wrong # coordinates: expected an even number, got 399
我手动检查过点数组的大小,确实是偶数。我又用 np.size 检查了一遍,结果是 398!
我还尝试了一个非常相似的测试方法,做了:
self.canvas.create_line([123,345,234,453,23,34,45,56,67,78])
结果非常顺利!我不明白为什么,但我的点数组似乎多了一个元素,我不知道是从哪里来的!
谢谢你的时间和耐心!
1 个回答
1
我觉得问题出在你使用了numpy数组。这里的调用过程大致是这样的:
- Tkinter.py,第2160行,调用create_line,返回self._create('line', args, kw)
- Tkinter.py,第2148行,在_create中,执行*(args + self._options(cnf, kw))))
- numeric.py,第1424行,在array_str中,返回array2string(a, max_line_width, precision, suppress_small, ' ', "", str)
- arrayprint.py,第307行,在array2string中,返回lst
如果你有np.array([0., 0., 200., 100.]),array2string()返回的字符串是'[ 0. 0. 100. 200.]'。我怀疑这个字符串会被拆分成['[', '0.', '0.', '100.', '200.]'],这样就多了一个元素'['。
如果你用列表代替np.array(),或者直接把numpy数组转换成列表,像这样:
self.canvas.create_line(list(points))
那么你的代码应该能正常工作。不过,我觉得如果你不需要numpy数组的功能,从一开始就用列表会更简单明了。