2017-06-16 77 views
-1

我正在编写一个程序来记录一些测量结果。为了记录每一秒钟,我在记录功能log()的末尾使用after()来记忆它。这是否创建一个递归,因此不按时间顺序返回日志? (每秒打印超过1个日志)如何确保每个条目的时间顺序为每秒1个日志?让Tkinter的after()按照时间顺序返回输出

下面是一些我的代码:

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()中移出或放在何处。

在此先感谢。

+0

您是否在使用线程? ''之后'不是递归的。并将始终按顺序执行项目。 –

+0

'self.screen.insert(INSERT,self.t)'调用中的INSERT是什么?如果'self.screen'是一个'list',那么'insert'方法的调用序列可能是错误的。 – martineau

+0

我愿意赌'self.screen'是一个tkinter文本小部件。 –

回答

0

这个问题比我做得更简单(在完全调查我自己的代码之前,学习了关于发布溢出的快速教程)。每次拨打log()时,我都没有将self.t重置为空字符串。再次感谢您的答案。

0

这是创建一个递归,因此不按时间顺序返回日志?

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

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

你描述的行为听起来像是你正在启动多个调用self.log()的“循环”,和/或你正在使用线程。