Reputation: 75
I was making a simple Python game. I was trying to fix the following error:
RuntimeError: threads can only be started once
I have tried .cancel()
the timer but that hasn't seem to be working, and I have made a if
statement to see if the timer .is_alive
before executing it. The console is throwing the error off at ball_char = play_timer.start()
.
def playball(state):
batbox = [["@", "@", "@", "@"], ["@", "#", "#", "#", "@"], ["@", "#", "#", "#", "@"], ["@", "#", "#", "#", "@"], ["@", "@", "@", "@"]]
play = "playing"
play_timer = Timer(1.0, pitch(batbox))
end_timer = Timer(6.0, pitch_end(play))
play_timer.cancel()
end_timer.cancel()
pstate = "idle"
inning = 1
outs = 0
pscore =0
cscore = 0
strikes = 0
ball_row = 0
ball_col = 0
ball_char = "."
while play == "playing":
batbox = [["@", "@", "@", "@"], ["@", "#", "#", "#", "@"], ["@", "#", "#", "#", "@"], ["@", "#", "#", "#", "@"], ["@", "@", "@", "@"]]
os.system('cls') # on windows
os.system('clear') # on linux / os x
# Playing the game
print "Press enter to start / hit the pitch"
print_grid(batbox)
input = raw_input("")
pstate = "hitting"
# Hitting
if pstate == "hitting":
ball_row = random_row(batbox)
ball_col = random_col(batbox)
end_timer.start()
while pstate == "hitting":
batbox[ball_row][ball_col] = ball_char
if play_timer.is_alive():
play_timer.cancel()
else:
ball_char = play_timer.start()
else:
play_timer.cancel()
end_timer.cancel()
state = "mainmenue"
return state
Upvotes: 5
Views: 14382
Reputation: 963
The documentation for Threading.Thread (of which Timer is a subclass) states:
start() Start the thread’s activity.
It must be called at most once per thread object. It arranges for the object’s run() method to be invoked in a separate thread of control.
This method will raise a RuntimeError if called more than once on the same thread object.
Even if you cancel a thread (or timer), you still cannot call start() again. You need to create a new thread/timer object or it is an error.
Upvotes: 11