使用Tkinter绑定和画布进行线程处理

时间:2012-12-22 17:18:07

标签: python multithreading tkinter bind

我遇到了Tkinter canvas.coords()方法的问题。我试图每1/60秒更新画布并尝试检测何时按下右箭头键。问题是,当我按住右箭头一段时间后,我收到一个错误:

http://postimage.org/image/bdfk3m8gx/

我的脚本是'novo.py',代码如下。也许有任何帮助?我只是一个乞丐。

import Tkinter, threading, time

def real_time(td, canvas):
    while True:
        time.sleep(1/60.0)
        canvas.coords('line',1,1,200,200)

def func(event):
    print 'key pressed'


root = Tkinter.Tk()
canvas = Tkinter.Canvas(root)
canvas.pack()
canvas.create_line(1,1,100,100, tag='line')
root.bind('<Right>', func)
thread = threading.Thread(target = real_time, args = (1/60.0, canvas))
thread.start()
root.mainloop()

1 个答案:

答案 0 :(得分:0)

Tkinter不是线程安全的,并且通常不需要线程。

在您的情况下,您可以使用after每隔N毫秒定期执行某些操作。例如,要运行大约每秒60次的东西,你会做这样的事情:

def real_time():
    <do something here>
    self.after(16, real_time)

然后,在程序启动时调用此函数一次:

real_time()