Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带有标志的PyQt5主窗口立即超出范围_Python_Garbage Collection_Pyqt5 - Fatal编程技术网

Python 带有标志的PyQt5主窗口立即超出范围

Python 带有标志的PyQt5主窗口立即超出范围,python,garbage-collection,pyqt5,Python,Garbage Collection,Pyqt5,我使用Qt设计器创建了UI。然后,我将ui文件转换为.py文件(pyuic-x)——如果直接启动,它可以正常工作。然后,我尝试在一个单独的文件中对ui进行子类化,以实现额外的逻辑。这就是事情开始出错的地方。从QMainWindow和我的Qt设计器文件继承可以正常工作,没有问题,正如预期的那样。然而,当我为我的QMainWindow设置任何WindowFlag(任何标志-我尝试了这些:StaysOnTop,FramelessWindowHint)并运行该文件时,窗口出现并立即消失。该程序继续在控制

我使用Qt设计器创建了UI。然后,我将ui文件转换为.py文件(pyuic-x)——如果直接启动,它可以正常工作。然后,我尝试在一个单独的文件中对ui进行子类化,以实现额外的逻辑。这就是事情开始出错的地方。从QMainWindow和我的Qt设计器文件继承可以正常工作,没有问题,正如预期的那样。然而,当我为我的QMainWindow设置任何WindowFlag(任何标志-我尝试了这些:StaysOnTop,FramelessWindowHint)并运行该文件时,窗口出现并立即消失。该程序继续在控制台窗口中运行,或作为PyCharm进程运行,但该窗口已消失。在我看来,它似乎超出了范围——但为什么设置一个简单的标志会对垃圾收集器产生任何影响呢?有人能解释一下这种行为吗

再现此现象所需的最低代码:

from ui import Ui_MainWindow
from PyQt5 import QtCore, QtWidgets, QtGui
import sys


class Logic(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.setupUi(self)
        self.show()
        # self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
        # self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.setAttribute(QtCore.Qt.WA_NoSystemBackground, True)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)
        

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = Logic()
    sys.exit(app.exec_())
窗口应出现并保持在屏幕上,直到一个(或多个)标志被取消注释。我将Python 3.8(32位)与PyQt5结合使用。PyCharm提供的运行环境。Windows 10。

来自:

注意:此函数在更改窗口的标志时调用setParent(),从而隐藏小部件。必须调用show()使小部件再次可见

因此,只需在设置标志后移动
self.show()
,或者从
\uuuu init\uuuu
外部调用它(在创建实例后),这是最常见和建议的方法,因为只有在实例化小部件后才显示小部件被认为是一种良好的做法