4

μy Mainclass は、次のQmainWindowsような単純なものを作成します。

class mcManageUiC(QtGui.QMainWindow):
    def __init__(self):
        super(mcManageUiC, self).__init__()

        self.initUI()

    def initUI(self):
        self.show()

そして、ファイルの最後で、次のように起動します。

def main():
    app = QtGui.QApplication(sys.argv)
    renderManagerVar = mcManageUiC()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

私の問題は、それをソースするたびに、新しいウィンドウが起動することです。スクリプト内の以前のクラス インスタンスの存在を検出する方法があるかどうか (古いものを閉じるか、新しいものを起動しないようにするため)、またはその他の解決策があるかどうかを知りたいですか?

また、py2exe でコードをコンパイルすると、Windows の .exe ファイルでも同じ問題が発生します。毎回新しいウィンドウを起動します。Windows がこのように動作しないように setup.py に何かを追加できますか?

それは可能ですか?

注:EclipseでコンパイルするWindows 7 64ビットを使用しています。

4

4 に答える 4

2

これを行うにはいくつかの方法があります。Class 属性を使用してすべてのインスタンスを格納できます。この方法で実行する場合は、weakref モジュールを介して弱参照として格納し、ガベージ コレクションの問題を防ぐことができます。

class MyClass(object):
    _instances=[]
    def __init__(self):
        if(len(self._instances) > 2):
            self._instances.pop(0).kill() #kill the oldest instance
        self._instances.append(self)

    def kill(self):
        pass #Do something to kill the instance

しかし、これは少し醜いです。また、(条件付きで) 新しいインスタンスを作成するある種の Factory の使用を検討することもできます。この方法はもう少し一般的です。

import weakref
class Factory(object):
     def __init__(self,cls,nallowed):
         self.product_class=cls  #What class this Factory produces
         self.nallowed=nallowed  #Number of instances allowed
         self.products=[]

     def __call__(self,*args,**kwargs):
         self.products=[x for x in self.products if x() is not None] #filter out dead objects
         if(len(self.products) <= self.nallowed):
             newproduct=self.product_class(*args,**kwargs)
             self.products.append(weakref.ref(newproduct))
             return newproduct
         else:
             return None

#This factory will create up to 2 instances of MyClass
#and refuse to create more until at least one of those 
#instances have died.
factory=Factory(MyClass,2)   
i1=factory("foo","bar")      #instance of MyClass
i2=factory("bar","baz")      #instance of MyClass
i3=factory("baz","chicken")  #None
于 2012-07-12T18:52:46.853 に答える
0

ソケットを独占できます

import socket
try:    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except:
    "Network Error!"

s.settimeout(30)
try:
    s.connect(('localhost' , 123))
except:
    "could not open...already in use socket(program already running?)"

これが良い方法かどうかはわかりませんが、過去に使用したことがあり、この問題を解決します

これは、複数のウィンドウを生成している単一のスクリプト内から新しいウィンドウを起動するのではなく、既に実行されているときにプログラムを起動するのを防ぐように設計されています...

于 2012-07-12T18:49:39.307 に答える
0

クラス変数を使用します。

class mcManageUiC(QtGui.QMainWindow):
    singleton = None
    def __init__(self):
        if not mcManageUiC.singleton: #if no instance yet
            super(mcManageUiC, self).__init__()

            self.initUI()
            ...
            mcManageUiC.singleton = self
        else: 
            ...


    def initUI(self):
        self.show()
于 2012-07-12T18:52:06.467 に答える