0

私は Python を初めて使用し (実際、PC 開発も初めてです)、作成中の Windows アプリケーションで FileDialog を使用して問題を適切に解決する方法を知りたいと考えています...

これまでのところ、私のコードの関連部分は次のとおりです...

def SelectLogs(self, event):

    dir = os.getcwd()
    paths = []

    open_dlg = wx.FileDialog(self, message='Select log file',
        defaultDir=dir, style=wx.OPEN | wx.CHANGE_DIR | wx.MULTIPLE)

    self.splitter.Refresh(True)

    if open_dlg.ShowModal() == wx.ID_OK:
        paths = open_dlg.GetPaths()
        open_dlg.Destroy()

        self.splitter.Refresh()

        self.RetrieveLogData(paths)

    def RetrieveLogData(self, paths):

        count = 0
        loglines = []

        self.tc2.WriteText('Loading selected logs...')

        paths.sort()

        for log in paths:
            read_data = []
            f = open(log, 'r')

            self.tc2.WriteText('\r\n    ' + log)

            read_data = f.readlines()
            f.close()

            count = count + 1

            for line in read_data:
                loglines.append(line)
                self.tc1.WriteText(line)

        self.tc2.WriteText('\r\nCompleted loading ' + str(count) + ' log(s)')

私の問題は、open_dlg.Destroy() と self.splitter.Refresh() を呼び出しても、wx.TextCtrl (tc2) オブジェクトの下部に表示される FileDialog の残りがまだ残っていることです (tc1 は上半分にあります)。下半分のスプリッターと tc2)。

ファイルが完全に読み込まれ、コンテンツが tc1 に表示されると、tc2 が更新され、期待どおりに表示されます。

スプリッターではなく tc1 と tc2 で更新メソッドを呼び出してみましたが、効果がないようです。

有用な提案は大歓迎です。ありがとう。

4

1 に答える 1

1

への呼び出しは必要なくRefresh()、それらは機能しません。GUI がフリーズする理由は異なります。コールバック関数の実行時間が長すぎて、GUI スレッドがブロックされます。

新しいスレッドを作成せずに、コールバック関数で数ミリ秒以上かかる可能性のあるタスクを実行しないでください。

長時間実行されるタスク用に新しいスレッドを作成する必要があります。wx.lib.delayedresultwx.CallAfterが最も便利なので、を使用することをお勧めします。SOに関するこのトピックには多くの質問/回答があります。例: wxPython GUI アプリケーションでスレッドを実装する方法

于 2012-04-04T10:28:11.200 に答える