让Tkinter的after()按照调用的时间顺序返回输出

时间:2017-06-16 17:22:55

标签: python logging tkinter

我正在编写一个程序来记录一些测量值。要记录每一秒,我在记录功能after()的末尾使用log()来回忆它。这会创建一个递归,因此不按时间顺序返回日志吗? (每秒打印超过1个日志)如何确保每个条目的时间顺序为每秒1个对数?

以下是我的一些代码:

 def log(self):

    if self.running ==True:

        self.current_date = time.strftime("%Y-%m-%d")
        now = datetime.datetime.now()
        self.current_time = datetime.time(now.hour, now.minute, now.second)

        if self.boolvars[0].get() == True:
            self.t = self.t + str(self.current_date) + ", "
        if self.boolvars[1].get() == True:
            self.t = self.t  + str(self.current_time) + ", "
        if self.boolvars[2].get() == True:
            self.t = self.t + str(self.mic.VacGetPressure(0)) + ", "
            self.champres.append(str(self.mic.VacGetPressure(0)))
        if self.boolvars[3].get() == True:

       ...
       ...
       ...

        self.screen.insert(INSERT, self.t)
        self.parent.after(1000,self.log)

以下是一些示例输出:

2017-06-16, 13:18:37, 0.001,
2017-06-16, 13:18:36, 0.001,
2017-06-16, 13:18:36, 0.001,
2017-06-16, 13:18:36, 0.001,
2017-06-16, 13:18:37, 0.001,
2017-06-16, 13:18:37, 0.001,
2017-06-16, 13:18:37, 0.001,
2017-06-16, 13:18:36, 0.001,
2017-06-16, 13:18:36, 0.001,
2017-06-16, 13:18:36, 0.001,
2017-06-16, 13:18:37, 0.001,
2017-06-16, 13:18:37, 0.001,
2017-06-16, 13:18:37, 0.001,
2017-06-16, 13:18:38, 0.001,
2017-06-16, 13:18:36, 0.001,
2017-06-16, 13:18:36, 0.001,
2017-06-16, 13:18:36, 0.001,
2017-06-16, 13:18:37, 0.001,

在第二列中,明确记录每秒发生一次以上,并且不按时间顺序返回。 对after()的任何解释都会有所帮助,如果我需要将其移出log(),或者放在哪里。

提前致谢。

2 个答案:

答案 0 :(得分:0)

  

这是否会产生递归,因此不会按时间顺序返回日志?

没有。 after的更好名称应为add_job_to_queue。它不会进行递归调用,只是向队列添加一个函数。 Tkinter将定期处理该队列,关闭并调用它们。

在调用self.log()一次后,队列中只会有一个项目。当tkinter处理队列时,它将弹出该项并运行它。在运行期间,会将新作业添加到队列中。然后tkinter会将其从队列中弹出,然后添加一个新的队列。等等。队列永远不会超过一个。

你所描述的行为听起来像是你开始不止一个"循环"调用self.log(),和/或您正在使用线程。

答案 1 :(得分:0)

问题是无限性比我做的更简单(在完全调查我自己的代码之前,我学到了关于快速溢出的教训)。每次调用self.t时,我都没有将log()重置为空字符串。再次感谢您的回答。