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を伴い
- のpython ./pyqt_freeze_testcase.py
- GUIウィンドウを移動して、PowerShellの横に(ないで)配置します。推理
- の下にはLINEEDITをクリックして、いくつかのもの を入力し、左は明らかである - プッシュボタン を左クリックし
- 予想通り>、ものがLINEEDITに現れた - >「本当に?」 QMessageBoxは、PowerShellの のどこに
- 左クリックを表示される - のいずれか「はい」または「いいえ」 を左クリックし、手順2
- 上記の理由であるGUIアプリケーションを、不明瞭にされ、>のPowerShellが発生しました - - >メッセージボックスが閉じますが、シェルに出力が表示されず、GUIが応答しなくなります(すぐにスピナー/砂時計が表示され、バナーに 'ダイアログ(応答なし)'と表示されます)より多くのものを入力して、プッシュボタンをクリックすると、何もしません。すべての出演のため、GUIが凍結されていますが、:
- どこでもPowerShellで左クリック
- 任意のキーを押し - >予想される応答(yepまたはnope)がシェルに表示され、GUIが再び応答します。つまり、手順3からすべてを繰り返すことができます。フリーズ中に入力した追加の入力がラインエディットに表示されるようになることを覚えておいてください。
実際に私がより直接的な原因を見つけるのに役立ちました。私は、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で動作します - そして、それはトリガーですそれ! –
(続きのコメント) - X-Mouseはおそらく同じregedit行を実行します。それらがなければ、凍結はありません。彼らと一緒に。私は上記のフリーズ動作を取得します。 –
だから誰かがこれを再現しようとするといいだろう!それにかかわらず、範囲がかなり変わったので私は新しい質問を開きます。ありがとう! –