Tkinter create_line проблема: неправильно # координаты: ожидается четное число

1

здесь идет мой первый вопрос, я делаю базовый logplayer из данных в 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], поэтому для каждого имени воздушного судна будет такой массив.

Второй для просто преобразует в tvinter 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
    Несмотря на то, что он не ответил на вопрос, мне удалось решить проблему: сначала я попытался использовать первые 4 точки массива точек, но все еще не работал (он получил 5 баллов). Что я забыл рассмотреть (и также упомянуть), так это то, что я работаю с массивами numpy, поэтому, когда я приводил массив numpy точек в список python, например: self.canvas.create_line (list (points)), проблема заключалась в том, что решена!
Теги:
tkinter

1 ответ

1
Лучший ответ

Я считаю, что проблема в том, что для этого вы используете массивы numpy. Стол вызовов выглядит так:

  1. Tkinter.py, строка 2160, в create_line return 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, precision, suppress_small, '', "", str)
  4. arrayprint.py, строка 307, в array2string возвращает lst

Если у вас есть np.array([0., 0., 200., 100.]), строка, возвращаемая array2string(), равна '[0. 0. 100. 200.]'. Я подозреваю, что тогда он получает split, возвращая список из ['[', '0.', '0.', '100.', '200.]'], который имеет один дополнительный элемент '['.

Код должен работать, если вы используете список вместо np.array() или даже если вы просто нанесли массив numpy в список, например:

self.canvas.create_line(list(points))

Хотя, я думаю, что использование списка с самого начала более прямолинейно, если вам не нужно использовать функциональность массивов numpy.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню