2011-01-09 16 views
1

機能が開き、正規表現は、いくつかのテキストに置き換えます。Pythonの3.1PyQtは "フラッシュ" と同等

def process(self): 
    # first do this!! 
    self.label.setText('Processing for 5-10 sec.....') 
    self.button.setEnabled(0) 

    # and only then heavy files operations 
    file = open(self.filename, mode='r', encoding='utf-8') 
    text = re.sub(r'^ (.+)\n ', r' \[\1\]\n ', file.read(), flags=re.MULTILINE) 
    newfile = open(self.filename+'temp', mode='w', encoding='utf-8') 
    file_new.write(text) 

    self.label.setText('Ready') 

を、PyQtは4.8.2

ファイルは十分な大きさで、操作は〜10秒かかります。
ボタンを押したときに、拳がラベル内のテキストを置き換えてボタンを無効にします。ユーザーは、しばらく待たなければならないことがわかります。

しかし、何も起こりません。システムは10秒間停止し、「準備完了」ラベルが表示され、ボタンが無効になります。

どうすればQtをラベル変更してボタンを無効にすることができますか?

答えて

1

私は2つの解決策を想像することができます。

まず、ラベルのテキストを設定してボタンを無効にした後で、QCoreApplication.processEvents()を呼び出してみてください。

第2に、最初の解決策が機能しない場合は、2つの方法で分割します。次に、最初のメソッドで、ラベルのテキストを設定し、ボタンを無効にして、QTimer.singleShot()を使用して2番目のメソッドを呼び出します。これは非同期に呼ばれるので、Qtイベント処理ループはGUIを更新する機会を与えます。

+0

processEvents()が動作し、spasibo! – Qiao

0

スレッドを使用する方が良い方法だと思います。

しかし、あなたがそれを設定する場所後

while self.button.isEnabled(): 
    pass 

を入れてみてください。

+0

「スレッド」とは何ですか? – Qiao

+1

@Qiao、それはコードを並行して実行する方法です。したがって、メインスレッドは責任あるGUIをユーザーに提供し続け、同時に別のスレッドが重い操作を実行します。 QtのQThreadや、Pythonのスレッド/スレッドモジュールを参照してください。スレッドを使用することは時々本当の痛みになることがありますが、落とし穴や同期の問題が多いためです。 –