2016-05-16 10 views
2

私が取り組んできた閉じて、これは私がこれまで持っているものです:私はクラスのメインウィンドウのMWを作成しようとするとPyQt4ウィンドウがPyQt4アプリケーションに自動的に

import sys 
from PyQt4 import QtGui, QtCore 

class PasswordPrompt(QtGui.QWidget): 

    def __init__(self): 
     super(PasswordPrompt, self).__init__() 
     self.initUi() 

    def initUi(self): 
     self.setFixedSize(500, 75) 
     self.setWindowTitle('Please enter the password...') 

     self.prompt = QtGui.QLineEdit(self) 
     self.btn = QtGui.QPushButton('Enter', self) 
     self.btn.clicked.connect(self.btnClicked) 

     self.hbox = QtGui.QHBoxLayout() 
     self.hbox.addWidget(self.prompt) 
     self.hbox.addWidget(self.btn) 

     self.vbox = QtGui.QVBoxLayout() 
     self.vbox.addLayout(self.hbox) 
     self.vbox2 = QtGui.QVBoxLayout() 

     self.vbox2.addSpacing(300) 
     self.hbox2 = QtGui.QHBoxLayout() 
     self.hbox2.addSpacing(150) 
     self.vbox2.addLayout(self.hbox2) 

     self.vbox.addLayout(self.vbox2) 

     self.setLayout(self.vbox) 
     self.center() 
     self.show() 

    def btnClicked(self): 
     pw = self.prompt.text() 

     if pw == "password": 
      print("Permission granted!") 
      self.close() 
      mw = MainWindow() 

     else: 
      print("Permissed denied!") 
      self.prompt.clear() 
      self.warningText = QtGui.QLabel('That is the wrong password!', self) 
      self.hbox2.addWidget(self.warningText) 

    def center(self): 
     qr = self.frameGeometry() 
     cp = QtGui.QDesktopWidget().availableGeometry().center() 
     qr.moveCenter(cp) 
     self.move(qr.topLeft()) 

class MainWindow(QtGui.QWidget): 

    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.initUi() 

    def initUi(self): 
     self.setWindowTitle('Main Menu') 
     self.setFixedSize(1000, 800) 

     self.show() 

def main(): 
    application = QtGui.QApplication(sys.argv) 
    p = PasswordPrompt() 
    sys.exit(application.exec()) 


if __name__=='__main__': 
    main() 

私の問題が来ます。なんらかの理由で、MainWindow.initui()を実行してからすぐに終了します。私はそれがmain()関数とQApplicationオブジェクトと関係があると仮定します。複数のウィンドウをコーディングしてこれを回避する最良の方法は何ですか?私はもともとウィンドウごとにクラスを作成しようとしていました:passwordPrompt、MainMenuなど、新しいウィンドウを読み込むために各クラスのインスタンスをインスタンス化しましたが、それは動作していないことがわかります。

+0

こんにちは@WewLad、あなたは答えの1つを見つけるのに役立ちましたか?あなたの問題が解決されることを願っています:-) –

答えて

0

私は少しあなたのコードを微調整しました。私はそれが動作するようになりまし信じる:

import sys 
import time 
from PyQt4 import QtGui, QtCore 

# Create two global variables: 
p = None  
mw = None 


# Create the class 'Communicate'. The instance 
# from this class shall be used later on for the 
# signal/slot mechanism. 
class Communicate(QtCore.QObject): 
    myGUI_signal = QtCore.pyqtSignal(str) 

''' End class ''' 


class PasswordPrompt(QtGui.QWidget): 

    def __init__(self): 
     super(PasswordPrompt, self).__init__() 
     self.initUi() 
     self.mySrc = Communicate() 
     self.mySrc.myGUI_signal.connect(startMainWindow) 

    def initUi(self): 
     self.setFixedSize(500, 75) 
     self.setWindowTitle('Please enter the password...') 

     self.prompt = QtGui.QLineEdit(self) 
     self.btn = QtGui.QPushButton('Enter', self) 
     self.btn.clicked.connect(self.btnClicked) 

     self.hbox = QtGui.QHBoxLayout() 
     self.hbox.addWidget(self.prompt) 
     self.hbox.addWidget(self.btn) 

     self.vbox = QtGui.QVBoxLayout() 
     self.vbox.addLayout(self.hbox) 
     self.vbox2 = QtGui.QVBoxLayout() 

     self.vbox2.addSpacing(300) 
     self.hbox2 = QtGui.QHBoxLayout() 
     self.hbox2.addSpacing(150) 
     self.vbox2.addLayout(self.hbox2) 

     self.vbox.addLayout(self.vbox2) 

     self.setLayout(self.vbox) 
     self.center() 
     self.show() 

    def btnClicked(self): 
     pw = self.prompt.text() 

     if pw == "password": 
      print("Permission granted!") 
      # self.close() 
      self.mySrc.myGUI_signal.emit("password") 


     else: 
      print("Permissed denied!") 
      self.prompt.clear() 
      self.warningText = QtGui.QLabel('That is the wrong password!', self) 
      self.hbox2.addWidget(self.warningText) 

    def center(self): 
     qr = self.frameGeometry() 
     cp = QtGui.QDesktopWidget().availableGeometry().center() 
     qr.moveCenter(cp) 
     self.move(qr.topLeft()) 

''' End class ''' 


class MainWindow(QtGui.QWidget): 

    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.initUi() 

    def initUi(self): 
     self.setWindowTitle('Main Menu') 
     self.setFixedSize(1000, 800) 

     self.show() 

''' End class ''' 

def main(): 
    global p 
    application = QtGui.QApplication(sys.argv) 
    p = PasswordPrompt() 
    sys.exit(application.exec()) 

def startMainWindow(passw): 
    global mw 
    global p 
    if(passw == "password"): 
     mw = MainWindow() 
     p.close() 
    else: 
     pass 


if __name__=='__main__': 
    main() 

私はPasswordPromptクラスに余分な変数を追加しました:mySrc変数。いわゆる「シグナルスロット」メカニズムを介して、に変数mySrcを接続します。

Simplest way for PyQT Threading

は多分シグナルスロットメカニズムは次のとおりです。あなたは、信号スロットメカニズムについての詳細を読みたい、との方法、それはあなたがスレッドセーフな方法で、GUIのと通信することができます場合は、この記事をチェックアウトあなたは他のスレッドを作成していないので、この特定の状況では少し過剰です。しかし、とにかく、それは動作します:-)。関数startMainWindow(passw)では、メインウィンドウインスタンスを作成します。その後、私はパスワードプロンプトのインスタンスを閉じます。両方のインスタンスが「グローバル変数」であることが重要です。メインウィンドウmwがグローバル変数でない場合、関数startMainWindow(passw)が終了すると、それは削除されます(ウィンドウはすぐに終了します)。これは、mwがその関数のローカル変数にすぎないためです。

これがあなたを助けてくれることを願っています。この解決策があなたに役立つかどうかお知らせください。

+0

私はこれ以上理解すれば分かります。 – WewLad

+0

素晴らしい:-) お手伝いできることがあれば教えてください。 –

+0

うわー、元のコードのmw変数をグローバルに変更しただけで、不思議なことにはうまくいきました。 – WewLad

0

あなたのコードを簡単に確認しました。 私も同様のことをやろうとしましたが、私にとってはうまくいきませんでした。 私が代わりに作ったのは、QDialogであり、返されたDialogCodeを確認し、それが受け入れられたらMainWindowを呼び出します。

import sys 
from PyQt4 import QtGui, QtCore 

class PasswordPrompt(QtGui.QDialog): 

    def __init__(self): 
     super(PasswordPrompt, self).__init__() 
     self.initUi() 

    def initUi(self): 
     self.setFixedSize(500, 75) 
     self.setWindowTitle('Please enter the password...') 

     self.prompt = QtGui.QLineEdit(self) 
     self.btn = QtGui.QPushButton('Enter', self) 
     self.btn.clicked.connect(self.btnClicked) 

     self.hbox = QtGui.QHBoxLayout() 
     self.hbox.addWidget(self.prompt) 
     self.hbox.addWidget(self.btn) 

     self.vbox = QtGui.QVBoxLayout() 
     self.vbox.addLayout(self.hbox) 
     self.vbox2 = QtGui.QVBoxLayout() 

     self.vbox2.addSpacing(300) 
     self.hbox2 = QtGui.QHBoxLayout() 
     self.hbox2.addSpacing(150) 
     self.vbox2.addLayout(self.hbox2) 

     self.vbox.addLayout(self.vbox2) 

     self.setLayout(self.vbox) 
     self.center() 

    def btnClicked(self): 
     pw = self.prompt.text() 

     if pw == "password": 
      print("Permission granted!") 
      self.accept() 

     else: 
      print("Permissed denied!") 
      self.prompt.clear() 
      self.warningText = QtGui.QLabel('That is the wrong password!', self) 
      self.hbox2.addWidget(self.warningText) 

    def center(self): 
     qr = self.frameGeometry() 
     cp = QtGui.QDesktopWidget().availableGeometry().center() 
     qr.moveCenter(cp) 
     self.move(qr.topLeft()) 

class MainWindow(QtGui.QWidget): 

    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.initUi() 

    def initUi(self): 
     self.setWindowTitle('Main Menu') 
     self.setFixedSize(1000, 800) 

     self.show() 

def main(): 
    application = QtGui.QApplication(sys.argv) 
    p = PasswordPrompt() 
    if p.exec_() == QtGui.QDialog.Accepted: 
     mw = MainWindow() 
    sys.exit(application.exec_()) 


if __name__=='__main__': 
    main() 

私はPyQt4の専門家ではないが、私はこのアプローチにいくつかのアプリを作って、私はそれが完全に有効だと思います。 お手伝い願います!

0

修正済みです。 MainWindow()のインスタンスに割り当てる前に、mw変数をグローバル変数として初期化しました。それは私が不思議にする必要があったすべてです。

+0

こんにちは@WewLad、私の答えはあなたに正しい方向に向かってきたので、少しupvoteが評価されるでしょう:-) –