这是我的第一个问题,我从 txt 文件中的数据做一个基本的日志播放器:
代码类似于:
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 是一个字典,每个名称都包含一个 [time,x,y] 类型的数组,因此每个飞机名称都会有一个类似的数组。
第二个简单地转换为 tkinter Canvas 坐标并将 currentPoint 附加到预先存在的(并初始化的)。
当它到达 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])
一切顺利!我不明白为什么,但不知何故,我的点数组最终得到了一个额外的元素,但我不知道从哪里来!
感谢您的时间和耐心!
最佳答案
我认为问题在于您为此使用了 numpy 数组。这里的调用堆栈看起来像这样
- Tkinter.py,第 2160 行,位于 创建行返回 self._create('line', args, kw)
- Tkinter.py,第 2148 行,在 _create
*(args + self._options(cnf, kw)))) - numeric.py,第 1424 行,在 array_str 中 返回数组2字符串(a, 最大线宽,精度, 抑制_小,'',“”,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 数组的功能,那么从一开始就使用列表会更直接。
关于python - Tkinter create_line问题: wrong # coordinates: expected an even number,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6470485/