1

use this simple code for run a window based on qdialog:

import maya.OpenMayaUI as mui
import sip
from PyQt4 import QtGui, QtCore, uic

#----------------------------------------------------------------------
def getMayaWindow():
    ptr = mui.MQtUtil.mainWindow()
    return sip.wrapinstance(long(ptr), QtCore.QObject)

#----------------------------------------------------------------------
form_class, base_class = uic.loadUiType('perforceBrowserWnd.ui')

#----------------------------------------------------------------------
class PerforceWindow(base_class, form_class):
    def __init__(self, parent=getMayaWindow()):
        super(base_class, self).__init__(parent)
        self.setupUi(self)

#----------------------------------------------------------------------
def perforceBrowser2():
    perforceBrowserWnd = PerforceWindow()
    perforceBrowserWnd.show()

perforceBrowser2()

every time you run the function perforceBrowser2() there is a new copy of windows.

how to find whether a window is already running and not to open a new copy of it, and go to the opened window? or just do not give a script to run a second copy of window?

ps. maya2014 + pyqt4 + python2.7

Massimo
  • 836
  • 3
  • 17
  • 38

2 Answers2

2

Keep a global reference to the window:

perforceBrowserWnd = None

def perforceBrowser2():
    global perforceBrowserWnd
    if perforceBrowserWnd is None:
        perforceBrowserWnd = PerforceWindow()
    perforceBrowserWnd.show()
ekhumoro
  • 115,249
  • 20
  • 229
  • 336
1

Using global's are not the preferred way and there are ton's of articles why it is a bad idea.

Why are global variables evil? It is cleaner to remember the instance in a static var of the class and whenever you load the UI, check if it does already exist and return it, if not create it. (There is a pattern called Singleton that describes this behaviour as well)

import sys

from Qt import QtGui, QtWidgets, QtCore

class Foo(QtWidgets.QDialog):
    instance = None
    def __init__(self, parent=None):
        super(Foo, self).__init__(parent)
        self.setWindowTitle('Test')

def loadUI():
    if not Foo.instance:
        Foo.instance = Foo()
    Foo.instance.show()
    Foo.instance.raise_()

loadUI()

Whenever you call loadUI it will return the same UI and will not recreate each time you call it.

user1767754
  • 23,311
  • 18
  • 141
  • 164