2017-06-29 46 views
1

Windows 10では、コマンドライン( 'python ./pyqt_freeze_testcase.py')から次のテストケースのGUIアプリケーションを実行すると、次の完全に反復可能なGUIフリーズ/ハング/応答しない動作; GUIが応答しなくなるたびに、シェルにキーを入力することで、私はそれを元気に戻すことができます。pyqt5ターミナルでクリックするとGUIがフリーズする

UPDATE:これは、フォーカスを追従することによってトリガされるように思われます。フォーカスが追従しているときにフリーズが発生しないようにする方法が問題になります。そのトピックの新しい質問を投稿しました:PyQt5 GUI freeze caused by Windows focus-follows-mouse

ビルトインシェル( 'cmd')とPowerShellの動作は同じです。フリーズを説明するためのアクションとレスポンスの詳細なスクリプトは、この記事の最後にあります。フリーズを防止するにはどうしたらいいですか/ GUIアプリケーションが応答性を保つことを確認しますか?

pyqt_freeze_testcase.py:

from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
from PyQt5.QtWidgets import * 

import sys 

# import the UI file created with pyuic5 
from minimal_ui import Ui_Dialog 

class MyWindow(QDialog,Ui_Dialog): 
    def __init__(self,parent): 
     QDialog.__init__(self) 
     self.parent=parent 
     self.ui=Ui_Dialog() 
     self.ui.setupUi(self) 

    def showMsg(self): 
     self.really1=QMessageBox(QMessageBox.Warning,"Really?","Really do stuff?", 
      QMessageBox.Yes|QMessageBox.No,self,Qt.WindowTitleHint|Qt.WindowCloseButtonHint|Qt.Dialog|Qt.MSWindowsFixedSizeDialogHint|Qt.WindowStaysOnTopHint) 
     self.really1.show() 
     self.really1.raise_() 
     if self.really1.exec_()==QMessageBox.No: 
      print("nope") 
      return 
     print("yep") 

def main(): 
    app = QApplication(sys.argv) 
    w = MyWindow(app) 
    w.show() 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    main() 

GUIだけLINEEDITとの対話及び(シグナル/スロットを有する)のボタンです。 、詳細なアクションと応答

# -*- coding: utf-8 -*- 

# Form implementation generated from reading ui file 'minimal.ui' 
# 
# Created by: PyQt5 UI code generator 5.8.2 
# 
# WARNING! All changes made in this file will be lost! 

from PyQt5 import QtCore, QtGui, QtWidgets 

class Ui_Dialog(object): 
    def setupUi(self, Dialog): 
     Dialog.setObjectName("Dialog") 
     Dialog.resize(400, 300) 
     self.lineEdit = QtWidgets.QLineEdit(Dialog) 
     self.lineEdit.setGeometry(QtCore.QRect(120, 90, 113, 22)) 
     self.lineEdit.setObjectName("lineEdit") 
     self.pushButton = QtWidgets.QPushButton(Dialog) 
     self.pushButton.setGeometry(QtCore.QRect(130, 150, 93, 28)) 
     self.pushButton.setObjectName("pushButton") 

     self.retranslateUi(Dialog) 
     self.pushButton.clicked.connect(Dialog.showMsg) 
     QtCore.QMetaObject.connectSlotsByName(Dialog) 

    def retranslateUi(self, Dialog): 
     _translate = QtCore.QCoreApplication.translate 
     Dialog.setWindowTitle(_translate("Dialog", "Dialog")) 
     self.pushButton.setText(_translate("Dialog", "PushButton")) 

新しいPowerShellのから始まる:

(Qtのデザイナーとpyuic5から)UIファイルminimal_ui.pyを伴い

  1. のpython ./pyqt_freeze_testcase.py
  2. GUIウィンドウを移動して、PowerShellの横に(ないで)配置します。推理
  3. の下にはLINEEDITをクリックして、いくつかのもの を入力し、左は明らかである - プッシュボタン を左クリックし
  4. 予想通り>、ものがLINEEDITに現れた - >「本当に?」 QMessageBoxは、PowerShellの のどこに
  5. 左クリックを表示される - のいずれか「はい」または「いいえ」 を左クリックし、手順2
  6. 上記の理由であるGUIアプリケーションを、不明瞭にされ、>のPowerShellが発生しました - - >メッセージボックスが閉じますが、シェルに出力が表示されず、GUIが応答しなくなります(すぐにスピナー/砂時計が表示され、バナーに 'ダイアログ(応答なし)'と表示されます)より多くのものを入力して、プッシュボタンをクリックすると、何もしません。すべての出演のため、GUIが凍結されていますが、:
  7. どこでもPowerShellで左クリック
  8. 任意のキーを押し - >予想される応答(yepまたはnope)がシェルに表示され、GUIが再び応答します。つまり、手順3からすべてを繰り返すことができます。フリーズ中に入力した追加の入力がラインエディットに表示されるようになることを覚えておいてください。

答えて

0

これはコメントとしては良いかもしれませんが、評判のポイントはありません。あなたのためではありません。

私はpython3とpython2.7の両方でWindows 10マシンで行ったことを正確にテストしました。あなたの質問で概説した状況を再現することはできません。すべてが期待どおりに機能し、「いいえ」と「いいえ」のメッセージがすぐに表示されます。あなたは次のようなものを試すことができます:PySide/Python GUI freezesしかし、印刷文はあなたのGUIをフリーズするべきではなく、コンソールに印刷してはいけません。あなたは間違いなくあなたのようないくつかの他のシンプルなGUIをチェックして、何が凍結していないかを確認する必要があります。私はあなたのコンピュータを最初に再起動します。それで答えが出ない場合は、PyQt5を再インストールしてみてください。

+0

実際に私がより直接的な原因を見つけるのに役立ちました。私は、X-MouseをLinuxのフォーカスを追従させずにマウスの動きを模倣するために使っていることを忘れていました(X-Mouseと呼ばれるいくつかのものがあります。これはhttps:// joelpurraのものです.com/projects/X-Mouse_Controls /)。これを無効にすると、フリーズ動作がなくなり、端末をクリックしても何も変わりません。だから私はhttps://sinewalker.wordpress.com/2010/03/10/ms-windows-focus-follows-mouse-registry-hacks/から同様のレジストリモッズを試しました - 彼らはまだWindows 10で動作します - そして、それはトリガーですそれ! –

+0

(続きのコメント) - X-Mouseはおそらく同じregedit行を実行します。それらがなければ、凍結はありません。彼らと一緒に。私は上記のフリーズ動作を取得します。 –

+0

だから誰かがこれを再現しようとするといいだろう!それにかかわらず、範囲がかなり変わったので私は新しい質問を開きます。ありがとう! –

0

ブルートフォースの解決策は、上記のリンク先の質問(PyQt5 GUI freeze caused by Windows focus-follows-mouse)で動作しています。完全なコードがそこに掲載されています。

誰かがより最適な解決策を提供できることを願っていますか?

基本的に、MainWindow のアクティブなウィンドウトラッキングを無効にし、MainWindow closeEventの初期設定に復元します。もっと最適な解決策があるかもしれませんが、これは短く信頼できます。メソッドhttps://joelpurra.com/projects/X-Mouse_Controls/はすぐに有効になりますが、レジストリのハックは再起動するまで有効になりません。

関連する問題