2011-06-24 33 views
1

去我第一次的問題,即時通訊做從數據基本logplayer在一個txt文件: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是一個字典,每個名稱都包含一個[time,x,y]類型的數組,因此每個飛機名稱都會有一個這樣的數組。

第二個用於簡單地轉換爲tkinter畫布座標並將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

儘管它並沒有回答這個問題,我設法解決這個問題: 我第一次嘗試使用第4個點的點陣列,並且仍然沒有工作(它得到了5分)。 我忘了什麼考慮(也提到)是我與numpy的陣列工作,所以當我投我的觀點numpy的陣列到Python的列表,像這樣: self.canvas.create_line(名單(分)) 問題解決了! –

回答

1

我相信問題是你正在使用numpy數組。這裏的調用堆棧看起來像這樣

  1. Tkinter.py,線2160,在 create_line返回 self._create( '行',指定參數時,KW)
  2. Tkinter.py,線2148,在_create
    *(參數+ self._options(CNF,千瓦))))
  3. numeric.py,線1424,在array_str 返回array2string(一, MAX_LINE_WIDTH,精度, suppress_small, '', 「」,STR)
  4. 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數組的功能,從一開始的列表更直接。