2013-12-25 3 views
1

Когда я запускаю сценарий, который я создал, я получаю очень странную ошибку. Я накладываю две функции, move() и moveWithMouse(). Соответствующий код размещен здесь:Странная ошибка черепахи при использовании функций потоковой передачи

def moving(): 

# Clearing the canvas and hiding the turtle for the next iteration of moving() 
turtle.clear() 
turtle.hideturtle() 

# Drawing all of the circles 
for i in range(len(xCoordinate)): 
    turtle.penup() 
    turtle.goto(xCoordinate[i], yCoordinate[i]) 
    turtle.pendown() 
    turtle.fillcolor(color[i][0], color[i][1], color[i][2]) 
    turtle.begin_fill() 
    turtle.circle(10)  
    turtle.end_fill() 
    xCoordinate[i] += speed1[i] 
    yCoordinate[i] += speed2[i] 
    turtle.update() 
    turtle.ontimer(moving, 10) 

Код для следующей функции:

def moveWithMouse(): 
    while True: 
    user = win32api.GetCursorPos() 
    mousepos = [user[0]-520,-1*(user[1])+ 415] 
    turtle.goto(mousepos) 
    turtle.onclick(turtle.pendown()) 

Тогда я нить, обе эти функции следующим образом:

if __name__ == '__main__': 
    Thread(target = moving).start() 
    Thread(target = moveWithMouse).start() 

И это даст мне это ошибка (очень длинная, но я все еще думаю, что размещать все это необходимо):

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "C:\Python32\lib\threading.py", line 736, in _bootstrap_inner 
    self.run() 
    File "C:\Python32\lib\threading.py", line 689, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Python33\Circles with Collision Detection.py", line 57, in moving 
    turtle.circle(10) 
    File "<string>", line 1, in circle 
    File "C:\Python32\lib\turtle.py", line 1991, in circle 
    self._go(l) 
    File "C:\Python32\lib\turtle.py", line 1605, in _go 
    self._goto(ende) 
    File "C:\Python32\lib\turtle.py", line 3159, in _goto 
    screen._pointlist(self.currentLineItem), 
    File "C:\Python32\lib\turtle.py", line 755, in _pointlist 
    cl = self.cv.coords(item) 
    File "<string>", line 1, in coords 
    File "C:\Python32\lib\tkinter\__init__.py", line 2162, in coords 
    self.tk.call((self._w, 'coords') + args))] 
    File "C:\Python32\lib\tkinter\__init__.py", line 2160, in <listcomp> 
    return [getdouble(x) for x in 
ValueError: could not convert string to float: 'coords' 

Exception in thread Thread-2: 
Traceback (most recent call last): 
    File "C:\Python32\lib\threading.py", line 736, in _bootstrap_inner 
    self.run() 
    File "C:\Python32\lib\threading.py", line 689, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Python33\Circles with Collision Detection.py", line 128, in moveWithMouse 
    turtle.goto(mousepos) 
    File "<string>", line 1, in goto 
    File "C:\Python32\lib\turtle.py", line 1774, in goto 
    self._goto(Vec2D(*x)) 
    File "C:\Python32\lib\turtle.py", line 3159, in _goto 
    screen._pointlist(self.currentLineItem), 
    File "C:\Python32\lib\turtle.py", line 755, in _pointlist 
    cl = self.cv.coords(item) 
    File "<string>", line 1, in coords 
    File "C:\Python32\lib\tkinter\__init__.py", line 2162, in coords 
    self.tk.call((self._w, 'coords') + args))] 
_tkinter.TclError: ambiguous option "": must be addtag, bbox, bind, canvasx, canvasy, cget, configure, coords, create, dchars, delete, dtag, find, focus, gettags, icursor, index, insert, itemcget, itemconfigure, lower, move, postscript, raise, scale, scan, select, type, xview, or yview 

Похоже, что это говорит о наличии проблемы с операторами goto в обеих функциях. Обе эти функции работают, когда я их не вставляю, но с резьбой, они, похоже, дают эту очень странную ошибку. Любые идеи почему?

ответ

0

Модуль turtle основан на Tkinter. Tkinter был спроектирован как однопоточный. То есть, чтобы избежать ошибок, все вызовы Tkinter должны происходить из одного потока.

Оба moving и moveWithMouse звонят turtle команд. Таким образом, вы не можете создавать два потока для запуска этих функций.

+0

Спасибо! Это не очень помогает, но, по крайней мере, это показывает, почему проблема существует. –

+0

Вы пытаетесь нарисовать круг, где пользователь нажимает мышь? В этом случае вместо вызова команд 'turtle' внутри' moveWithMouse' просто измените 'xCoordinate' и' yCoordinate' и пусть 'move' выполнит весь чертеж. – unutbu

+0

Это не то, что я пытаюсь сделать. Я пытаюсь создать еще один мяч каждые 5 секунд. –

0

Модуль черепахи Python не претендует на то, чтобы быть потокобезопасным (см. bug 1702036). Поэтому вы не можете предположить, что перемещение двух черепах вокруг будет работать так, как ожидалось (это то, что вы делаете: в обоих потоках вы перемещаете черепаху для рисования).

Смежные вопросы