2017-06-30 1 views
0

Lorsque Windows focus-follows-mouse-without-raise-the-window est activé par l'une des deux méthodes ci-dessous, l'interface graphique de PyQt5 se fige vous devez taper n'importe quel caractère dans le terminal à partir duquel vous avez exécuté Python afin de débloquer l'interface graphique; description complète et cas de test (Windows 10, Python 3.6.1, PyQt5) est ici: pyqt5 click in terminal causes GUI freezeGel de l'interface graphique PyQt5 provoqué par Windows focus-follows-mouse

Pour activer le comportement focus-follows-mouse-without-raise, essayez l'une des solutions suivantes - elles fonctionnent toutes les deux dans Windows 10:

Donc - quelques questions:

  1. Quelqu'un peut-il reproduire le problème? Cela semble 100% reproductible pour moi, mais ce serait bien d'entendre la même chose de quelqu'un d'autre.
  2. y a-t-il un moyen de changer le code python pour détecter-et-contourner focus-follows-mouse, ou simplement pour y être immunisé, c'est-à-dire peut-être que l'application GUI reprendra toujours le focus cliquez dans un dialogue ou qmessagebox appartenant à la fenêtre principale de l'interface graphique, ou par d'autres moyens? (La hiérarchie des objets est-elle configurée de manière optimale, sinon, peut-être que tout cela pourrait être résolu en corrigeant la structure de propriété?)

Répondre

0

La solution brute-force semble fonctionner, mais je voudrais laisser cette question ouvrir pour voir si quelqu'un connaît une solution plus optimale; il a fallu beaucoup de recherches pour trouver le bon chemin; principalement en jetant un coup d'oeil sur le code open-source pour X-Mouse. Fondamentalement, cette méthode prend effet immédiatement, alors que le hack du registre ne prend effet qu'au redémarrage.

Nouvelle version de pyqt_freeze_testcase.py (le fichier de la question stackoverflow référencée); les modifications ne sont que des ajouts, notés entre des lignes de marques de hachage:

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

import sys 
####################### added begin: 
import win32gui 
import win32con 
####################### added end 

# 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) 
     ################################# added begin: 
     self.initialWindowTracking=False 
     try: 
      self.initialWindowTracking=win32gui.SystemParametersInfo(win32con.SPI_GETACTIVEWINDOWTRACKING) 
     except: 
      pass 
     if self.initialWindowTracking: 
      print("Window Tracking was initially enabled. Disabling it for now; will re-enable on exit.") 
      win32gui.SystemParametersInfo(win32con.SPI_SETACTIVEWINDOWTRACKING,False) 
     ################################# added end 

    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") 

     ################################## added begin: 
    def closeEvent(self,event): 
     if self.initialWindowTracking: 
      print("restoring initial window tracking behavior ("+str(self.initialWindowTracking)+")") 
      win32gui.SystemParametersInfo(win32con.SPI_SETACTIVEWINDOWTRACKING,self.initialWindowTracking) 
     ################################## added end 

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

if __name__ == "__main__": 
    main()