2

私はしばらくの間、Windows で PyQt アプリケーションを作成しており、Linux で適切に動作するかどうかを確認したいと考えていました。gui アプリケーションは基本的に、qtconsole/notebook で使用することを意図した科学ツールキットのシェルです。Linux システムと Windows システムはどちらも Anaconda 3.5 に基づいており、PyQt5 を実行しています。Windows では正常に動作しますが、Linux で実行すると、Qt ウィンドウがポップアップし、ウィンドウの下にあったグラフィックスがその場でフリーズします (下の画像を参照)。コマンドラインにエラーはまったく表示されません。ウィンドウがポップアップするだけで、ウィジェットはまったく表示されません。さらに、ウィンドウの上部にある x ボタンで閉じようとすると、「アプリケーションが応答しません」というダイアログが表示され、強制終了する必要があります。

コードベースは非常に大きい (この投稿には大きすぎる) ため、この問題のコード例を実際に入れることはできません (このプログラム以外ではまだエラーを再現できていません)。このサイトから、単純な GUI プログラムで動作する例をいくつか取得したと言えます: https://github.com/Deusdies/pythonbo。私のコードには、多くのウィジェット サブクラスがあり、プロットに pyqtgraph (github の最新バージョン) を使用し、多くの MDI サブウィンドウがあります。

基礎となるツールキットのその他のパッケージには、次のものがあります。

  • numpy、numba、scipy、matplotlib
  • フィット
  • pyexcel、pyexcel-xlsx
  • pyvisa、pyserial
  • パイパークリップ

MDI サブウィンドウ ウィジェットを個別のプログラムとして実行しようとすると、メイン プログラムを実行した場合と同じ問題が発生します。

誰かが以前にこの状況に遭遇したことがあり、問題が何であるかを確認するために調査する必要がある可能性が高いことを提案できるかどうか、私は興味があると思います.

凍結された PyQt アプリケーション

4

1 に答える 1

2

一般的な答えは、2 つの QApplication イベント ループが初期化されているということでした。

問題のコードは、私が使用していたpyperclipと呼ばれる小さなモジュールにあることが判明しました。これは最初にインポートされ、その後、GUI コードの下部で QApplication をインスタンス化していました。

pyperclip はある程度ネイティブに Windows クリップボードにアクセスできるため、これは Windows では問題ではありませんでしたが、Linux では QtClipboard を使用します。私の解決策は、pyperclip コードを編集して、アプリケーションが既に実行されているかどうかを検出し、pyperclip をインポートする前に gui アプリケーションをインスタンス化することでした。

コードの編集

pyperclip コードの pyperclip.clipboards モジュールの 51 行目で、次の行を変更しました。

app = QApplication([])

これに:

app = QApplication.instance()
if app is None:
    app = QApplication([])
于 2016-07-04T20:02:53.077 に答える