【问题标题】:Python's Tkinter after() function jumps CPUPython 的 Tkinter after() 函数跳转 CPU
【发布时间】:2017-01-08 16:29:54
【问题描述】:

我正在使用 tkinter 构建 Python GUI 应用程序。 基本上我正在启动并与不同的线程集成,而通信使用输入和输出队列。

在 GUI 端(tkinter 的 mainloop() 所在的主线程)我想添加一个函数,该函数将在主循环的每次迭代中调用(我正在实时处理和显示信息)。

所以我的函数是这样的:

def loop(self):
    try:
        output_type, data = wlbt.output_q.get_nowait()
        pass  # if got something out of the queue, display it!
    except Queue.Empty:
        pass
    self.loop_id = self.after(1, self.loop)

在启动程序时,我只需调用self.loop_id = self.after(1, self.loop)

所以有两件事困扰我:

  1. 循环功能将 CPU 使用率提高 30%-50%。如果我禁用它,那很好。
  2. 我希望能够使用 after_idle() 来最大化刷新率,但我无法直接替换它 - 得到并出错。

我感觉到有些东西我不完全理解。可以做些什么来解决这些问题?

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    当您调用self.after(1, self.loop) 时,您要求一个函数大约每毫秒运行一次。由于您每秒进行 1000 次函数调用,因此 CPU 使用率上升一点也不奇怪。

    鉴于人类无法感知这么多变化,如果您所做的只是更新显示,那么没有理由每秒执行超过 20-30 次。

    【讨论】:

    • 知道了,如果我想让它在主循环有资源时执行,我该怎么办?我应该用after_idle() 做吗?如果有,怎么做?
    • @galah92:我的建议就是我写的:每 20 或 30 秒调用一次函数。如果您的目标是为人类更新显示,那么频繁地进行检查只会浪费计算周期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2021-09-24
    • 2014-02-01
    • 1970-01-01
    相关资源
    最近更新 更多