我是Python的新手,也是一般的事件驱动/ GUI编程。据我所知,所有的事件选择都是鼠标点击和按键。
我在一个独立的库中编写了一组函数,这些函数从I2C设备读取(在Raspberry Pi上)。如果没有读取,函数返回-1。所以基本上,我想循环,每次都调用read函数,直到返回-1之外的东西。
我的第一直觉是写下这样的东西:
readResult = -1
while (readResult == -1):
readResult = IO.read()
changeGUI()
这似乎在tkinter结构中起作用。我知道如何在按下按钮时调用函数,但我不知道如何进行自定义事件。
答案 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内再次运行。