2017-06-16 36 views
-1

という順番に出力されます。いくつかの測定値を記録するプログラムを作成しています。 1秒ごとにログを記録するには、ログ機能の最後にafter()を使用してlog()を呼び出しています。これは再帰を作成するので、時間の順序でログを返さないのでしょうか? (1秒間に1ログ以上も印刷する)どのように各エントリが1ログ/秒で時間順になっていることを確認できますか? 2列目のTkinterのafter()戻り値は

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, 

、はっきりログインより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) 

は、いくつかのサンプル出力は次のとおりです。ここで

は、私のコードの一部であります時間の順序で返されます。 after()の説明は役に立ちます。log()のどこかに移動する必要がある場合、またはそれをどこに置く必要がありますか。

ありがとうございます。

+0

スレッドを使用していますか? 'after'は再帰的ではありません。常に順番に項目を実行します。 –

+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()を一度呼び出すと、キューには1つのアイテムしか表示されません。 tkinterがキューを処理すると、そのアイテムがポップされて実行されます。実行中に、新しいジョブがキューに追加されます。それから、tkinterはそれをキューから取り除き、新しいものが追加されます。等々。キューは決して大きくなりません。

あなたが記述する動作は、self.log()を呼び出す複数の「ループ」を開始している、および/またはスレッドを使用しているように見えます。