起初,我认为这是一个可以在我找到的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
方法或线程模块有关的内容,否则我无法理解如何解决此问题。
答案 0 :(得分:1)
尝试使用after
版本,但在“0.0018
和playerY
之后添加更多内容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()