Tkinter'绑定'与'canvas'并线程化ValueError

时间:2014-07-03 18:41:44

标签: python multithreading canvas tkinter

起初,我认为这是一个可以在我找到的this帖子中解决的问题。但是,我试图实现after方法,但它似乎不起作用。 (关于我如何相信我的问题不同而且重复的更多信息在下面稍微进一步了。)

尝试将button-1绑定到函数callback时形成错误,该函数从不同于其他所有内容的线程运行。有问题的代码在这里

def callback(event):
    print(event)  #This function normally changes playerY, however it prints the event for debugging purpose.

def drawPlayer():
    global playerY, playerY2
    player = canvas.create_oval(50,50,100,100,fill="yellow",outline="black")
    while True:
        canvas.coords(player,(50,50,100,100))  #This would usually use playerY and playerY2 but for debugging it does not.
        playerY += 0.0018
        playerY2 += 0.0018

root.bind("<Button-1>",callback)
thread2 = Thread(target=drawPlayer)
thread2.start()

显然,root,playerY,playerY2等内容已被定义,但我不会粘贴我的整个代码。

单击按钮1时,将产生以下追溯

Exception in thread Thread-2:
Traceback (most recent call last):
  File "C:\Python33\lib\threading.py", line 637, in _bootstrap_inner
    self.run()
  File "C:\Python33\lib\threading.py", line 594, in run
     self._target(*self._args, **self._kwargs)
  File "C:\Users\Harvey\Documents\School Work\Computer    Science\Tkinter\tkinterFallpyBird.py", line 58, in drawPlayer
    canvas.coords(player,(50,50,100,100))
  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: 'None'

另一个主题告诉我使用&#39;之后的&#39;来解决这个问题。方法。为此,我尝试了:

def drawPlayer():
    global playerY, playerY2,player
    canvas.coords(player,(playerY,50,playerY2,100))
    playerY += 0.0018
    playerY2 += 0.0018

    root.after(1,drawPlayer)

root.bind("<Button-1>",callback)

player = canvas.create_oval(50,50,100,100,fill="yellow",outline="black")
drawPlayer()

root.mainloop()

需要重复调​​用我的函数drawPlayer,因此在线程版本中使用while循环。我觉得这就是我的问题与我在开始时所联系的问题的不同之处。我尝试在0调用中使用root.after(),但这只是在drawPlayer()调用未运行后导致代码。

除非我遗漏了与after方法或线程模块有关的内容,否则我无法理解如何解决此问题。

<小时/> 旁注:我意识到我不应该在tkinter中制作游戏,尤其是需要同时发生多项事情的游戏。但是,我在学校这样做,我想要使用的模块(Pygame或Pyglet)不能仅仅为我制作一个没有真正目的的游戏。如果我可以使用除了tkinter之外的东西,我可能会。谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

尝试使用after版本,但在“0.0018playerY之后添加更多内容playerY2

至少尝试1

工作示例:

from Tkinter import *

root = Tk()

canvas = Canvas(root)
canvas.pack()

playerY = 50
playerY2 = 100

def drawPlayer():
    global playerY, playerY2,player
    canvas.coords(player,(playerY,50,playerY2,100))
    playerY += 1
    playerY2 += 1
    root.after(10,drawPlayer)

#root.bind("<Button-1>",callback)

player = canvas.create_oval(50,50,100,100,fill="yellow",outline="black")
drawPlayer()

root.mainloop()