【问题标题】:Threading with Tkinter bind and canvas使用 Tkinter 绑定和画布进行线程处理
【发布时间】:2012-12-22 17:18:07
【问题描述】:

我在使用 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()

【问题讨论】:

  • 您使用的是什么版本的 Python、Tkinter 和 Tk?但是,更重要的是,当您在与启动它的线程不同的线程中更改其元素时,GUI 包通常会出现错误的行为。您要么过于简化了问题,要么根本不需要线程。看看 Tkinter 中的 after 方法。
  • 我使用 python 2.7.3 和它安装的所有东西。我想使用 after 但它的问题是你不能传递任何参数导致堆栈变得太大而不是因为它被递归调用
  • Tkinter 不是线程安全的。这可能会有所帮助:tkinter.unpythonic.net/wiki/mtTkinter 不过,不确定您要实现什么。与其一直更新,不如使用一些事件绑定。
  • 对不起。后方法完美。我显然以错误的方式使用它,这个例子运行没有任何问题。谢谢mmgp :)

标签: python multithreading tkinter bind


【解决方案1】:

Tkinter 不是线程安全的,而且通常根本不需要线程。

在您的情况下,您可以使用 after 每 N 毫秒定期运行一次。例如,要每秒运行大约 60 次,您可以执行以下操作:

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

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

real_time()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 2016-05-15
    相关资源
    最近更新 更多