Python 如何在PyQt4中打开新窗口时关闭旧窗口

Python 如何在PyQt4中打开新窗口时关闭旧窗口,python,pyqt,pyqt4,maya,Python,Pyqt,Pyqt4,Maya,我已经在Maya中使用PyQt4和来自internet的代码创建了一个modelEditor,但我不知道在再次运行此脚本时如何关闭它。我已经尝试过使用sys.exit(app.exec_389;()),但这不起作用 # -*- coding: utf-8 -*- from PyQt4 import QtCore, QtGui import maya.cmds as cmds import maya.OpenMayaUI as mui import sip import sys global

我已经在Maya中使用PyQt4和来自internet的代码创建了一个modelEditor,但我不知道在再次运行此脚本时如何关闭它。我已经尝试过使用
sys.exit(app.exec_389;())
,但这不起作用

# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui 
import maya.cmds as cmds
import maya.OpenMayaUI as mui 
import sip
import sys
global app
class MyDialog(QtGui.QDialog):

    def __init__(self, parent, **kwargs):
        super(MyDialog, self).__init__(parent, **kwargs)

        self.setObjectName("MyWindow")
        self.resize(800, 600)
        self.setWindowTitle("PyQt ModelPanel Test")

        self.verticalLayout = QtGui.QVBoxLayout(self)        
        self.verticalLayout.setObjectName("mainLayout")
        layout = mui.MQtUtil.fullName(long(sip.unwrapinstance(self.verticalLayout)))
        cmds.setParent(layout)

        self._cameraName = cmds.camera()[0]
        self.newEditor = cmds.modelEditor()
        nodeName = cmds.modelEditor(self.newEditor,cam=self._cameraName,edit = True,hud = 0,alo = 0,pm = 1,da = "smoothShaded")        
        ptr = mui.MQtUtil.findControl(nodeName)        
        self.modelPanel = sip.wrapinstance(long(ptr), QtCore.QObject)

        self.verticalLayout.addWidget(self.modelPanel)

    def show(self):
        super(MyDialog, self).show()        
        self.modelPanel.repaint()

def show():
    if (cmds.window(MyDialog,ex = True)):
        cmds.deleteUI(MyDialog)

    global app    
    app = QtGui.QApplication.instance()    
    ptr = mui.MQtUtil.mainWindow()    
    win = sip.wrapinstance(long(ptr), QtCore.QObject)
    d = MyDialog(win)
    d.show()

这里有一个方法你可以去做。 拥有一个将保存类实例的类单例。然后在构造函数中检查实例是否存在;如果是,则删除它并重置变量

# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui 
import maya.cmds as cmds
import maya.OpenMayaUI as mui 
import sip
import sys
global app

class MyDialog(QtGui.QDialog):

    instance = None # This will contain an instance of this class.

    def __init__(self, parent, **kwargs):
        # Delete any existing instance, then set this as the current instance.
        self.delete_instance()
        self.__class__.instance = self

        super(MyDialog, self).__init__(parent, **kwargs)

        self.setObjectName("MyWindow")
        self.resize(800, 600)
        self.setWindowTitle("PyQt ModelPanel Test")

        self.verticalLayout = QtGui.QVBoxLayout(self)        
        self.verticalLayout.setObjectName("mainLayout")
        layout = mui.MQtUtil.fullName(long(sip.unwrapinstance(self.verticalLayout)))
        cmds.setParent(layout)

        self._cameraName = cmds.camera()[0]
        self.newEditor = cmds.modelEditor()
        nodeName = cmds.modelEditor(self.newEditor,cam=self._cameraName,edit = True,hud = 0,alo = 0,pm = 1,da = "smoothShaded")        
        ptr = mui.MQtUtil.findControl(nodeName)        
        self.modelPanel = sip.wrapinstance(long(ptr), QtCore.QObject)

        self.verticalLayout.addWidget(self.modelPanel)

    def delete_instance(self):
        if self.__class__.instance is not None:
            try:
                self.__class__.instance.deleteLater()
            except Exception as e:
                pass

    def show(self):
        super(MyDialog, self).show()        
        self.modelPanel.repaint()

def show():
    global app
    app = QtGui.QApplication.instance()    
    ptr = mui.MQtUtil.mainWindow()    
    win = sip.wrapinstance(long(ptr), QtCore.QObject)
    d = MyDialog(win)
    d.show()
请注意,如果您打开了一个实例,并且
reload()
模块,它将不会删除打开的实例,因为类将不同