1

I have coded in python before but i haven't used tkinter much. I have written this code and i can't figure out why it isn't working. I have check on the internet and haven't found anything. This has happend before but unfortunately i can't find the program.

this is the code

from tkinter import *
import time
import threading
import random
C = Canvas()
class ball(threading.Thread):
    def run(self):
        x =  1
        y =  1
        ball = C.create_oval(0,0,10,10,fill = "Green")
        C.pack()
        while True:
            C.move(ball,x,y)
            C.update()
            time.sleep(0.03)
            if C.coords(ball)[0] > 200:
                x = x - random.randint(1,2)
                if x > 2:
                    x = 2
                elif x < -2:
                    x = -2
            if C.coords(ball)[1] > 200:
                y = y - random.randint(1,2)
                if y > 2:
                    y = 2
                elif y < -2:
                    y = -2
            if C.coords(ball)[0] < 0:
                x = x + random.randint(1,2)
                if x > 2:
                    x = 2
                elif x < -2:
                    x = -2
            if C.coords(ball)[1] < 0:
                y = y + random.randint(1,2)
                if y > 2:
                    y = 2
                elif y < -2:
                    y = -2



for i in range(3):
    class Child(ball):
        pass
    childball = Child()
    childball.start()
    time.sleep(1)

it keeps returning different errors each time for example

Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Python33\lib\threading.py", line 901, in _bootstrap_inner
    self.run()
  File "C:/Python33/Game.py", line 35, in run
    if C.coords(ball)[0] < 0:
  File "C:\Python33\lib\tkinter\__init__.py", line 2299, in coords
    self.tk.call((self._w, 'coords') + args))]
_tkinter.TclError: bad option "35.0 34.0 45.0 44.0": 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

Exception in thread Thread-2:
Traceback (most recent call last):
  File "C:\Python33\lib\threading.py", line 901, in _bootstrap_inner
    self.run()
  File "C:/Python33/Game.py", line 23, in run
    if C.coords(ball)[0] > 200:
  File "C:\Python33\lib\tkinter\__init__.py", line 2299, in coords
    self.tk.call((self._w, 'coords') + args))]
_tkinter.TclError: invalid command name "89.0 49.0 99.0 59.0"

and

Exception in thread Thread-3:
Traceback (most recent call last):
  File "C:\Python33\lib\threading.py", line 901, in _bootstrap_inner
    self.run()
  File "C:/Python33/Game.py", line 23, in run
    if C.coords(ball)[0] > 200:
  File "C:\Python33\lib\tkinter\__init__.py", line 2299, in coords
    self.tk.call((self._w, 'coords') + args))]
  File "C:\Python33\lib\tkinter\__init__.py", line 2297, in <listcomp>
    return [getdouble(x) for x in
ValueError: could not convert string to float: 'coords'

can anyone help.

Bryan Oakley
  • 370,779
  • 53
  • 539
  • 685

1 Answers1

0

You cannot access tkinter widgets in any thread except for the one that creates the widgets -- tkinter isn't designed to work with multiple threads.

If all you're doing is simple animations, you don't need threads. This answer gives an example of doing animation with tkinter's after method.

Community
  • 1
  • 1
Bryan Oakley
  • 370,779
  • 53
  • 539
  • 685