【问题标题】:Tkinter I/O EventsTkinter I/O 事件
【发布时间】:2014-03-20 19:50:26
【问题描述】:

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

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

我的第一反应是这样写:

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

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

【问题讨论】:

    标签: python tkinter event-handling


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-03
        • 2013-09-16
        • 2015-05-24
        • 2012-05-01
        • 2010-12-25
        相关资源
        最近更新 更多