Python Tkinter I / O事件

时间:2014-03-20 19:50:26

标签: python tkinter

我是Python的新手,也是一般的事件驱动/ GUI编程。据我所知,所有的事件选择都是鼠标点击和按键。

我在一个独立的库中编写了一组函数,这些函数从I2C设备读取(在Raspberry Pi上)。如果没有读取,函数返回-1。所以基本上,我想循环,每次都调用read函数,直到返回-1之外的东西。

我的第一直觉是写下这样的东西:

    readResult = -1
    while (readResult == -1):
        readResult = IO.read()
    changeGUI()

这似乎在tkinter结构中起作用。我知道如何在按下按钮时调用函数,但我不知道如何进行自定义事件。

2 个答案:

答案 0 :(得分:0)

有几种方法可以解决这个问题 - 您可以放弃使用Tkinter的mainloop(),并构建自己的事件循环,轮询这两种类型的事件。或者,您可以生成一个单独的线程来监视IO。或者,您可以使用Tkinter的after()方法。

对于前两种情况,如果IO.read()立即返回,无论是否有结果,那么您可能希望在循环中抛出time.sleep()调用,以避免占用CPU

答案 1 :(得分:0)

如果您对IO.read()的调用没有阻止,并且花费的时间不长,那么设置一个循环来每隔几毫秒轮询设备就非常容易了。你需要做的就是这样:

def read_one_result():
    readResult = IO.read()
    if readResult != -1:
        changeGUI()
    root.after(100, read_one_result)

这将读取一个结果,如果读取了任何内容则更新GUI,并且计划本身将在100ms内再次运行。

相关问题