0

私は運が悪いので、しばらくの間解決しようとしてきた本当に奇妙な問題を抱えています。

私のプログラムはメイン フレーム、メニュー バーで構成され、メニュー バーの下には読み取り専用モードのテキスト コントロールがあり、その下にはステータス バーがあります。

私のメインクラス内には、いくつかの関数があります。そのうちの 1 つを以下に示します。メニュー イベントでは、そのメニュー イベントに関連付けられた関数が呼び出されます。以下の関数は、処理しようとしているファイルの名前を textctrl に出力し、次にファイルを処理し、次に出力する次のファイルに移動して textctrl に出力し、そのファイルを処理するなど...

代わりに、すべてのファイルが処理されている間、textctrl ボックスとステータスバーが完全に消えます。処理が終了すると、すべてのテキストが印刷されて再表示されます。

なぜ消えてしまうのかわかりません。問題を解決するためにさまざまな方法で関数内のコードを移動しましたが、役に立ちませんでした。

どんな助けでも大歓迎です。

---編集--- コードが削除されました

4

1 に答える 1

1

何が起こっているかというと、プロセスが作業でビジーであるため、更新するために GUI へのサイクルを放棄していません。

ビジー プロセスを独自のスレッドに移動する必要があります。

あなたは次のようなことをしたいと思うでしょう

import threading

class Encrypt(threading.Thread):
    def __init__(self, threadNum, asset, window):
        threading.Thread.__init__(self)
        self.threadNum = threadNum
        self.window = window
        self.signal = True

    def run(self):
        while self.signal:
            do_stuff_that_is_cpu_intensive
            for self.path in self.paths: #etc..

メインの wx.Frame クラスで:

class Frame(wx.Frame):
def __init__(self, *args, **kwargs):
    super(Frame, self).__init__(*args, **kwargs)

    self.InitUI()
    self.Show()
    self.count = 0 # simple thread counter. 
    self.threads = [] # this lets you iterate over your threads if you ever need to

def OnEncrypt(self):
    self.count += 1
    thread = Encrypt(self.count, asset, self)
    self.threads.append(thread)
    thread.start()

ここでより詳細な方法と説明を参照してください: http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

于 2013-08-06T18:24:52.260 に答える