Tkinter画布小部件

时间:2014-06-24 20:41:39

标签: tkinter python-3.3

我以前用python编码但是我还没有使用过tkinter。我写了这段代码,但我无法弄清楚它为什么不起作用。我在网上查了一下,没找到任何东西。这已经发生过,但不幸的是我无法找到该计划。

这是代码

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)

每次都会不断返回不同的错误,例如

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"

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'

任何人都可以提供帮助。

1 个答案:

答案 0 :(得分:0)

除了创建小部件的线程外,您无法访问任何线程中的tkinter小部件 - tkinter不适用于多个线程。

如果您所做的只是简单的动画,则不需要线程。 This answer给出了使用tkinter的after方法进行动画的示例。