Tkinter create_line问题:错误的#坐标:预期是偶数

时间:2011-06-24 15:58:45

标签: python tkinter

这是我的第一个问题,即从txt文件中的数据做基本的logplayer:

代码类似于:

    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 coords并将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]) 

完美!我不明白为什么,但不知怎的,我的点数组最终得到一个额外的元素,我不知道从哪里来!

感谢您的时间和耐心!

1 个答案:

答案 0 :(得分:1)

我认为问题在于您正在使用numpy数组。这里的调用堆栈看起来像这样

  1. Tkinter.py,第2160行,in create_line返回 self._create('line',args,kw)
  2. Tkinter.py,第2148行,在_create中 *(args + self._options(cnf,kw))))​​
  3. numeric.py,第1424行,在array_str中 return array2string(a, max_line_width,精度, suppress_small,'',“”,str)
  4. arrayprint.py,307行,in array2string return lst
  5. 如果你有np.array([0。,0.,200。,100.]),array2string()返回的字符串是'[0. 0. 100. 200。]'< / strong>即可。我怀疑它会被分裂返回 ['[','0','0','100','200。]'] 的列表,其中有一个额外的元素' [”。

    如果您使用列表代替np.array(),或者您只是将numpy数组转换为列表,则代码应该可以工作,例如:

    self.canvas.create_line(list(points))
    

    虽然,如果您不需要使用numpy数组的功能,我认为从一开始就使用列表会更直接。