2017-01-18 25 views
-1

2つの異なる方法があります.1つは矢印キーでタートルを制御し、もう1つは自動カメの配列を制御します。プログラムを実行すると、このエラーが発生する2つのスレッドを実行しようとするとエラーが発生する

Unhandled exception in thread started by <function falconMove at 0x7f6c9af61aa0> 
Traceback (most recent call last): 
    File "/home/bernardk/Code/Python/FinalProject/FinalProject.py", line 198, in falconMove 
    wn.onkey(up, "Up") 
    File "/usr/lib/python2.7/lib-tk/turtle.py", line 1343, in onkey 
    self._onkey(fun, key) 
    File "/usr/lib/python2.7/lib-tk/turtle.py", line 711, in _onkey 
    self.cv.bind("<KeyRelease-%s>" % key, eventfun) 
    File "/usr/lib/python2.7/lib-tk/turtle.py", line 440, in bind 
    self._canvas.bind(*args, **kwargs) 
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1098, in bind 
    return self._bind(('bind', self._w), sequence, func, add) 
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1048, in _bind 
    needcleanup) 
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1220, in _register 
    self.tk.createcommand(name, f) 
RuntimeError: main thread is not in main loop 
Unhandled exception in thread started by <function evilMove at 0x7f6c9af61b18> 
Traceback (most recent call last): 
    File "/home/bernardk/Code/Python/FinalProject/FinalProject.py", line 211, in evilMove 
    traveler.forward(travelerSpeed) 
    File "/usr/lib/python2.7/lib-tk/turtle.py", line 1553, in forward 
    self._go(distance) 
    File "/usr/lib/python2.7/lib-tk/turtle.py", line 1521, in _go 
    self._goto(ende) 
    File "/usr/lib/python2.7/lib-tk/turtle.py", line 2991, in _goto 
    screen._pointlist(self.currentLineItem), 
    File "/usr/lib/python2.7/lib-tk/turtle.py", line 761, in _pointlist 
    cl = self.cv.coords(item) 
    File "<string>", line 1, in coords 
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 2300, in coords 
    self.tk.call((self._w, 'coords') + args))) 
RuntimeError: main thread is not in main loop 

これはスレッドによって使用されるコードです。

def falconMove(a): 
    time.sleep(.1) 
    global wn 
    wn.onkey(up, "Up") 
    wn.onkey(left, "Left") 
    wn.onkey(right, "Right") 
    wn.onkey(down, "Down") 
    wn.listen() 

def evilMove(a): 
    time.sleep(.1) 
    global alive 
    global success 
    global blockNum 
    global traveler 
    global travelerSpeed 
    traveler.forward(travelerSpeed) 

    for i in range(0, len(evil), 1): 
     evil[i].forward(speed[i] + (travelerSpeed * 2)) 
     for j in range(0, len(evil), 1): 
      if collide(turt, evil[j]): 
       alive = False 
       success = False 
      if collide(traveler, evil[j]): 
       alive = False 
       success = False 
     if evil[i].ycor() < -(height/2): 
      evilReset(i, False) 
     if collide(turt, nice): 
      blockNum += 1 
      nice.goto(random.randint(-(width/2) + 20, (width/2) - 20), 
         random.randint(-(height/2) + 120, (height/2) - 20)) 
      buildBlock(blockNum, True) 
     if blockNum == 9 or traveler.xcor() > width/2: 
      success = True 
      alive = False 


thread.start_new_thread(falconMove, (1,)) 
thread.start_new_thread(evilMove, (1,)) 

必要であれば、これは、私はコードが乱雑であり、それが動作プログラムではない、私はちょうどスレッドが最初に動作するように取得したい知っている、プログラム全体

import turtle 
import random 
import gtk 
import threading 
import thread 
import time 

travelerSpeed = 0 
while travelerSpeed > 10 or travelerSpeed < 1: 
    travelerSpeed = input("Enter the difficulty(1-10): ") 

#Turtle Settings 
wn = turtle.Screen() 
falcon = "/home/bernardk/Code/Python/FinalProject/ship.gif" 
falconR = "/home/bernardk/Code/Python/FinalProject/shipR.gif" 
falconL = "/home/bernardk/Code/Python/FinalProject/shipL.gif" 
falconD = "/home/bernardk/Code/Python/FinalProject/shipD.gif" 
wn.addshape(falcon) 
turt = turtle.Turtle() 
turtle.bgcolor("black") 
turt.pu() 
turt.shape(falcon) 
turt.fillcolor("snow") 
turt.goto(0, 0) 

#Screen Setup 
window = gtk.Window() 
screen = window.get_screen() 
width = screen.get_width() 
height = screen.get_height() 
wn.screensize() 
wn.setup(width=1.0, height=1.0) 

#Key Action Handelers 
def up(): 
    global falcon 
    turt.setheading(90) 
    #turt.shape(falcon) 
    turt.forward(2) 

def left(): 
    global falconL 
    turt.setheading(180) 
    #turt.shape(falconL) 
    turt.forward(2) 

def right(): 
    global falconR 
    turt.setheading(0) 
    #turt.shape(falconR) 
    turt.forward(2) 

def down(): 
    global falconD 
    turt.setheading(270) 
    #turt.shape(falconD) 
    turt.forward(2) 

#Supports on the Bottom 
builder = turtle.Turtle() 
builder.tracer(0) 
builder.pencolor("snow") 
builder.fillcolor("snow") 
builder.ht() 
startx = -width/2 
starty = (-height/2) + 100 
blockWidth = width/10 
blockHeight = 50 

def buildBlock(num, fill): 
    builder.pu() 
    builder.goto(startx + (blockWidth*num), starty) 
    builder.pd() 
    if fill: 
     builder.begin_fill() 
    builder.setheading(0) 
    for i in range(2): 
     builder.forward(blockWidth) 
     builder.right(90) 
     builder.forward(blockHeight) 
     builder.right(90) 

    if fill: 
     builder.end_fill() 

for i in range(10): 
    buildBlock(i, False) 

#Make the helpless traveler 
traveler = turtle.Turtle() 
traveler.pu() 
traveler.pensize(2) 
traveler.goto(-width/2, (-height/2) + 25) 
traveler.setheading(0) 
traveler.pencolor("navy") 
traveler.pd() 
traveler.pensize(3) 

#Laser Colors 
colors = ["blue2", "green2", "red", "purple3", "snow", "yellow2"] 

#Declare Nice Guy 
nice = turtle.Turtle() 
nice.shape("circle") 
nice.fillcolor("cyan") 
nice.pencolor("cyan") 
nice.pu() 
nice.goto(random.randint((-width/2) + 20, (width/2) - 20), random.randint((-height/2) + 120, (height/2) - 20)) 

#Declare Evil Entities 
e0 = turtle.Turtle() 
e1 = turtle.Turtle() 
e2 = turtle.Turtle() 
e3 = turtle.Turtle() 
e4 = turtle.Turtle() 
e5 = turtle.Turtle() 
e6 = turtle.Turtle() 
e7 = turtle.Turtle() 
e8 = turtle.Turtle() 
e9 = turtle.Turtle() 
e10 = turtle.Turtle() 
e12 = turtle.Turtle() 
e13 = turtle.Turtle() 
e14 = turtle.Turtle() 
e15 = turtle.Turtle() 
e16 = turtle.Turtle() 
e17 = turtle.Turtle() 
e18 = turtle.Turtle() 
e19 = turtle.Turtle() 
e20 = turtle.Turtle() 
e21 = turtle.Turtle() 
e22 = turtle.Turtle() 
e23 = turtle.Turtle() 
e24 = turtle.Turtle() 
e25 = turtle.Turtle() 
e26 = turtle.Turtle() 
e27 = turtle.Turtle() 
e28 = turtle.Turtle() 
e29 = turtle.Turtle() 
e30 = turtle.Turtle() 
e31 = turtle.Turtle() 
e32 = turtle.Turtle() 
e33 = turtle.Turtle() 
e34 = turtle.Turtle() 
e35 = turtle.Turtle() 
e36 = turtle.Turtle() 
e37 = turtle.Turtle() 
e38 = turtle.Turtle() 
e39 = turtle.Turtle() 
e40 = turtle.Turtle() 
e41 = turtle.Turtle() 
e42 = turtle.Turtle() 
e43 = turtle.Turtle() 
e44 = turtle.Turtle() 
e45 = turtle.Turtle() 
e46 = turtle.Turtle() 
e47 = turtle.Turtle() 
e48 = turtle.Turtle() 
e49 = turtle.Turtle() 

evil = [e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49,] 
speed = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
difficulty = [6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6] 

def evilReset(i, first): 
    if difficulty[i] < 10: 
     difficulty[i] += 1 
    evil[i].tracer(0) 
    if first: 
     evil[i].goto(random.randint(-(width/2), (width/2)), random.randint((height/2), (height * 1.5))) 
    else: 
     evil[i].goto(random.randint(-(width/2), (width/2)), random.randint((height/2), (height/2 + 30))) 
    evil[i].tracer(1) 
    speed[i] = random.randint(5, difficulty[i]) 
    evil[i].fillcolor(colors[random.randint(0, 5)]) 
    evil[i].setheading(270) 

for i in range(0, len(evil), 1): 
    evil[i].pu() 
    evilReset(i, True) 

def collide(turt1, turt2): 
    if turt1.xcor() - turt2.xcor() < 10: 
     if turt.ycor() - nice.ycor() < 10: 
      return True 
     else: 
      return False 
    else: 
     return False 

alive = True 
success = False 
blockNum = -1 

def falconMove(a): 
    time.sleep(.1) 
    global wn 
    wn.onkey(up, "Up") 
    wn.onkey(left, "Left") 
    wn.onkey(right, "Right") 
    wn.onkey(down, "Down") 
    wn.listen() 

def evilMove(a): 
    time.sleep(.1) 
    global alive 
    global success 
    global blockNum 
    global traveler 
    global travelerSpeed 
    traveler.forward(travelerSpeed) 

    for i in range(0, len(evil), 1): 
     evil[i].forward(speed[i] + (travelerSpeed * 2)) 
     for j in range(0, len(evil), 1): 
      if collide(turt, evil[j]): 
       alive = False 
       success = False 
      if collide(traveler, evil[j]): 
       alive = False 
       success = False 
     if evil[i].ycor() < -(height/2): 
      evilReset(i, False) 
     if collide(turt, nice): 
      blockNum += 1 
      nice.goto(random.randint(-(width/2) + 20, (width/2) - 20), 
         random.randint(-(height/2) + 120, (height/2) - 20)) 
      buildBlock(blockNum, True) 
     if blockNum == 9 or traveler.xcor() > width/2: 
      success = True 
      alive = False 


thread.start_new_thread(falconMove, (1,)) 
thread.start_new_thread(evilMove, (1,)) 


#for thread in thread_list: 
# thread.start() 
# thread.join() 

while alive: 
    #Turtle Movement 
    pass 


if success: 
    exit() 
    print("Congrats you Won") 
else: 
    exit() 
    print("You suck better luck next time") 

print("The End") 

#turtle.mainloop() 

です。ありがとう:)

+0

[こちら](http://stackoverflow.com/questions/14694408/runtimeerror-main-thread-is-not-in-main-loop)およびリンクされた質問をご覧ください。 –

+0

ところで、 'for'ループを使って" Evil Entities "を作成することができます。このコードがなくてもコードは短くなります。' e0'、 'e49' – furas

+0

ほとんどのGUIはメインスレッドで動かなければなりません。 'turtle'は' thread-safe'ではない 'tkinter'を使いますので、メインスレッドでのみ動くべきです。あなたは他のスレッドで他の要素を実行することができます(いくつかの計算)が、メインスレッドでのみGUI要素(ウィジェット、イベント)を使用する必要があります。 – furas

答えて

2

私はあなたが望むようにスレッドが必要であるとは思わない - あなたは単にタートルを使用することができますontimer()イベント。

from turtle import Turtle, Screen 
import random 

travelerSpeed = 0 
while travelerSpeed > 10 or travelerSpeed < 1: 
    travelerSpeed = int(input("Enter the difficulty(1-10): ")) 

# Screen Setup 
screen = Screen() 
screen.bgcolor("black") 
screen.setup(width=1.0, height=1.0) 
width = screen.window_width() 
height = screen.window_height() 

# Turtle Settings 
# falcon = "/home/bernardk/Code/Python/FinalProject/ship.gif" 
# screen.addshape(falcon) 

turt = Turtle(shape="turtle") 
turt.speed("fastest") 
turt.fillcolor("snow") 
turt.pu() 
turt.goto(0, 0) 

# Key Action Handlers 
def up(): 
    turt.setheading(90) 
    turt.forward(2) 

def left(): 
    turt.setheading(180) 
    turt.forward(2) 

def right(): 
    turt.setheading(0) 
    turt.forward(2) 

def down(): 
    turt.setheading(270) 
    turt.forward(2) 

# Supports on the Bottom 
builder = Turtle(visible=False) 
builder.color("snow") 

startx = -width/2 
starty = (-height/2) + 100 
blockWidth = width/10 
blockHeight = 50 

def buildBlock(num, fill): 
    builder.pu() 
    builder.goto(startx + (blockWidth * num), starty) 
    builder.pd() 

    if fill: 
     builder.begin_fill() 

    builder.setheading(0) 
    for _ in range(2): 
     builder.forward(blockWidth) 
     builder.right(90) 
     builder.forward(blockHeight) 
     builder.right(90) 

    if fill: 
     builder.end_fill() 

screen.tracer(0) 
for i in range(10): 
    buildBlock(i, False) 
screen.tracer(1) 

# Make the helpless traveler 
traveler = Turtle() 
traveler.pensize(3) 
traveler.pencolor("navy") 
traveler.setheading(0) 
traveler.pu() 
traveler.goto(-width/2, -height/2 + 25) 
traveler.pd() 

# Laser Colors 
colors = ["blue", "green", "red", "purple", "white", "yellow"] 

# Declare Nice Guy 
nice = Turtle(shape="circle") 
nice.pencolor("cyan") 
nice.pu() 
nice.goto(random.randint((-width/2) + 20, (width/2) - 20), random.randint((-height/2) + 120, (height/2) - 20)) 

# Declare Evil Entities 
evil = [Turtle() for _ in range(50)] 
speed = [0] * len(evil) 
difficulty = [6] * len(evil) 

def evilReset(i, first): 
    if difficulty[i] < 10: 
     difficulty[i] += 1 
    if first: 
     evil[i].goto(random.randint(-width // 2, width // 2), random.randint(-height // 2, height // 2)) 
    else: 
     evil[i].goto(random.randint(-width // 2, width // 2), random.randint(-height // 2 + 30, height // 2)) 
    speed[i] = random.randint(5, difficulty[i]) 
    evil[i].fillcolor(random.choice(colors)) 
    evil[i].setheading(270) 

screen.tracer(0) 
for i, entity in enumerate(evil): 
    entity.pu() 
    evilReset(i, True) 
screen.tracer(1) 

def collide(turt1, turt2): 
    if turt1.xcor() - turt2.xcor() < 10: 
     return turt1.ycor() - turt2.ycor() < 10 

    return False 

alive = True 
success = False 
blockNum = -1 

def evilMove(): 
    global alive 
    global success 
    global blockNum 

    traveler.forward(travelerSpeed) 

    for i in range(len(evil)): 
     evil[i].forward(speed[i] + (travelerSpeed * 2)) 
     for j in range(len(evil)): 
      if collide(turt, evil[j]): 
       alive = False 
       success = False 
      if collide(traveler, evil[j]): 
       alive = False 
       success = False 
     if evil[i].ycor() < -(height/2): 
      evilReset(i, False) 
     if collide(turt, nice): 
      blockNum += 1 
      nice.goto(random.randint(-(width/2) + 20, (width/2) - 20), random.randint(-(height/2) + 120, (height/2) - 20)) 
      buildBlock(blockNum, True) 
     if blockNum == 9 or traveler.xcor() > width/2: 
      success = True 
      alive = False 

    if not alive: 
     if success: 
      print("Congrats you Won") 
     else: 
      print("You suck, better luck next time") 

     print("The End") 
     exit() 

    screen.ontimer(evilMove, 100) 

screen.onkey(up, "Up") 
screen.onkey(left, "Left") 
screen.onkey(right, "Right") 
screen.onkey(down, "Down") 
screen.listen() 

screen.ontimer(evilMove, 100) 

screen.mainloop() 

これは完璧ではありませんが、可能なことの感覚を与えるはずです。

関連する問題