0

一度作成されたテキストファイルは常に書き込まれており、毎回テキストファイル全体を再印刷したくないため、新しい行をコンソールに出力しています。ファイルのサイズが大きくなるかどうかを確認しています。そうであれば、次の新しい行を印刷するだけです。これはほとんど機能していますが、次の新しい行について少し混乱することがあり、新しい行が数行上に表示され、古い行と混ざって表示されます。これを行うためのより良い方法はありますか、以下は私の現在のコードです。

infile = "Null"
while not os.path.exists(self.logPath):
    time.sleep(.1)

if os.path.isfile(self.logPath):
    infile = codecs.open(self.logPath, encoding='utf8')
else:
    raise ValueError("%s isn't a file!" % file_path)

lastSize = 0
lastLineIndex = 0
while True:
    wx.Yield()
    fileSize = os.path.getsize(self.logPath)
    if fileSize > lastSize:
        lines = infile.readlines()
        newLines = 0
        for line in lines[lastLineIndex:]:
            newLines += 1
            self.running_log.WriteText(line)

        lastLineIndex += newLines

        if "DBG-X: Returning 1" in line:
            self.subject = "FAILED! - "
            self.sendEmail(self)
            break
        if "DBG-X: Returning 0" in line:
            self.subject = "PASSED! - "
            self.sendEmail(self)
            break
    fileSize1 = fileSize
    infile.flush()
    infile.seek(0)

infile.close()

また、テキスト ファイルが作成されるのを待っている間に、表示されるまでに数秒かかるため、アプリケーションがフリーズします。

乾杯。

4

2 に答える 2

0

たぶんあなたなら:

  • 読み込む必要があるたびにファイルを開き、
  • 最後の読み取りで停止した場所に直接lastSize引数として使用します。seek

追加のコメント: 何らかの保護が必要かどうかはわかりませんが、指定されたファイル名がファイルであるかどうかをわざわざテストする必要はないと思います。それをtry...exceptブロックで開き、問題があればそれをキャッチします。

アプリケーションのフリーズに関しては、ある種のスレッド化を使用したい場合があります。たとえば、1 つのスレッド (メインのスレッド) が GUI を処理し、2 つ目のスレッドがファイルが作成されるのを待ちます。ファイルが作成されると、2 番目のスレッドがシグナルを GUI スレッドに送信し、表示するデータが含まれます。

于 2014-03-05T15:21:35.970 に答える
0

この解決策が役立ちます。と を使用して、ファイルが表示されるまで少し待つ必要もありos.path.isfileますtime.sleep

于 2014-03-05T15:23:21.340 に答える