python - pyqt5: 2 フォームの表示でエラーが発生しました。名前 'Window' が定義されていません

ジョセフ

ようこそ..

私は 2 つのフォームを持っています: Form1=>Window & form2 =>MainWindow

この問題は、メイン ウィンドウで終了ボタンを押した後に発生します。再びログインウィンドウに戻るはずの場所。

form1 (ログイン用ウィンドウ) コード:

import sys
from PyQt5.QtWidgets import *
from form2 import *
class Window(QWidget):
    right_uname = "admin"
    right_pword = "password"

    def __init__(self):
        super().__init__()

        self.init_ui()

    def init_ui(self):
        self.lbl_intro = QLabel('Welcome, please login')
        self.lbl_enter_username = QLabel('Username:')
        self.lbl_enter_password = QLabel('Password:')
        self.txt_enter_username = QLineEdit()
        self.txt_enter_password = QLineEdit()
        self.cb_login = QCheckBox('Stay logged in?')
        self.btn_login = QPushButton('Login')


        self.grid = QGridLayout()
        self.grid.setSpacing(5)

        self.grid.addWidget(self.lbl_intro, 1, 1)

        self.grid.addWidget(self.lbl_enter_username, 2, 0)
        self.grid.addWidget(self.txt_enter_username, 2, 1)

        self.grid.addWidget(self.lbl_enter_password, 3, 0)
        self.grid.addWidget(self.txt_enter_password, 3, 1)

        self.grid.addWidget(self.cb_login, 4, 1)
        self.grid.addWidget(self.btn_login, 5, 1)


        self.v_box = QVBoxLayout()
        self.v_box.addStretch(0)
        self.v_box.addLayout(self.grid)
        self.v_box.addStretch(0)

        self.h_box = QHBoxLayout()
        self.h_box.addStretch(0)
        self.h_box.addLayout(self.v_box)
        self.h_box.addStretch(0)

        self.setLayout(self.h_box)

        self.btn_login.clicked.connect(lambda: self.btn_login_clk(self.txt_enter_username, self.txt_enter_password, self.cb_login.isChecked(), self.lbl_intro))


        self.setWindowTitle('Login test')

        self.show()

    def btn_login_clk(self, username, password, cb, intro):
        if username.text() == self.right_uname and password.text() == self.right_pword:
            if cb:
                intro.setText('Welcome,' + ' ' + self.right_uname + ' ' + 'cb ticked')
            else:
                self.mw = MainWindow()
                self.hide()
                self.mw.show()
        else:
            intro.setText('Wrong username or password')
            self.clear_box()

    def clear_box(self):
        self.txt_enter_username.clear()
        self.txt_enter_password.clear()
        self.txt_enter_username.setFocus()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    a_window = Window()
    sys.exit(app.exec())

from2 (メインウィンドウ) コード:

from form1 import *
class MainWindow(Window):


    def __init__(self):
        super().__init__()

        self.init_ui()

    def init_ui(self):
        self.lbl_intro = QLabel('Main Window')
        self.lbl_user_logged = QLabel('Welcome,' + ' ' + self.right_uname)
        self.lbl_append = QLabel('Write something')
        self.txt_write_box = QLineEdit()
        self.btn_append = QPushButton('Append')
        self.btn_logout = QPushButton('Logout')

        layout = QVBoxLayout()
        layout.addWidget(self.lbl_intro)
        layout.addWidget(self.lbl_user_logged)
        layout.addWidget(self.lbl_append)
        layout.addWidget(self.txt_write_box)
        layout.addWidget(self.btn_append)
        layout.addWidget(self.btn_logout)

        self.setLayout(layout)
        self.setWindowTitle('Main')

        self.btn_append.clicked.connect(self.append_clk)
        self.btn_logout.clicked.connect(self.logout_action)

        self.show()

    def append_clk(self):
        self.appendee = open('text.txt', 'a')
        self.appendee.write('hry')
        self.appendee.close()

    def logout_action(self):
        self.close()
        a_window = Window(self)
        a_window.show()
        a_window.clear_box()

実行時: 名前 'Window' が定義されていません

ファーンアンドル

ある種の循環インポートの問題のように見えますが、それを再現することはできません。どのバージョンの Python を使用していますか?

とにかく、まず、MainWindow を使用する直前に、そのインポートがローカルになるように form1 を変更して、問題が解決するかどうかを確認します。from form2 import *つまり、form1 の上部にある行を削除し、btn_login_clk メソッドを次のように変更します。

def btn_login_clk(self, username, password, cb, intro):
    if username.text() == self.right_uname and password.text() == self.right_pword:
        if cb:
            intro.setText('Welcome,' + ' ' + self.right_uname + ' ' + 'cb ticked')
        else:
            from form2 import MainWindow  # local import
            self.mw = MainWindow()
            self.hide()
            self.mw.show()
    else:
        intro.setText('Wrong username or password')
        self.clear_box()

少し関係のないトピックですが、MainWindow を閉じる (つまり、ログアウトする) ときに、閉じたばかりの MainWindow に親を設定して Window を作成することがわかりました。これにより、新しいウィンドウが表示される前でも強制終了される可能性があるため (私の場合、何も表示されず、Python はコード 1 で終了します)、self引数を削除する必要があります。

def logout_action(self):
    self.close()
    a_window = Window()  # no 'self' argument
    a_window.show()
    a_window.clear_box()

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ネストされたPythonクラス定義の問題:同じ構文を使用して2つのクラスを定義しましたが、1つで「未定義の名前」エラーが発生します

分類Dev

Python PyQt5:画像が読み込まれません

分類Dev

フォーム1を使用して開いたフォーム2は、どのボタンクリックでも機能しませんpyqt5

分類Dev

名前エラー-名前が定義されていません-Python3.6.2

分類Dev

Python EXECショーエラー:名前が定義されていません

分類Dev

Pythonコード、名前が定義されていませんエラー

分類Dev

python turtle名前エラー:形状が定義されていません

分類Dev

AngularJS 2エラー:enableProdModeが定義されていません

分類Dev

PythonのNameError、名前が定義されていません

分類Dev

vuejsが作成したフック:window / localstorageが定義されていません

分類Dev

Python、エラー:「関数が定義されていません」、

分類Dev

Angular2 5分のインストールバグ-要件が定義されていません

分類Dev

Python NameError:名前 'include'が定義されていません

分類Dev

Python NameError:名前が定義されていません

分類Dev

Python NameError:名前が定義されていません

分類Dev

Python JSON:NameError:名前 'false'が定義されていません

分類Dev

Python:NameError:名前 'u'が定義されていません

分類Dev

Python3.5-名前「await」が定義されていません

分類Dev

Python 3:NameError:名前 'sklearn'が定義されていません

分類Dev

Python Django NameError:名前 'datetime'が定義されていません

分類Dev

NameError:名前 'logged'が定義されていません、Flask Python

分類Dev

Python:名前 'set_password'が定義されていません

分類Dev

Python NameError:名前 ''が定義されていません

分類Dev

NameError:名前 'x'が定義されていません(Python 3.7)

分類Dev

Python クラス: ラムダ名エラー - 名前が定義されていません

分類Dev

Pythonのnamerror名が定義されていません

分類Dev

Python 2.7 @propertyを使用すると、「グローバル名 '_c__pro'が定義されていません」というエラーが発生します

分類Dev

Pythonモジュールで名前が定義されていません

分類Dev

Pythonの名前エラー:NameError:名前 '宝石'が定義されていません

Related 関連記事

  1. 1

    ネストされたPythonクラス定義の問題:同じ構文を使用して2つのクラスを定義しましたが、1つで「未定義の名前」エラーが発生します

  2. 2

    Python PyQt5:画像が読み込まれません

  3. 3

    フォーム1を使用して開いたフォーム2は、どのボタンクリックでも機能しませんpyqt5

  4. 4

    名前エラー-名前が定義されていません-Python3.6.2

  5. 5

    Python EXECショーエラー:名前が定義されていません

  6. 6

    Pythonコード、名前が定義されていませんエラー

  7. 7

    python turtle名前エラー:形状が定義されていません

  8. 8

    AngularJS 2エラー:enableProdModeが定義されていません

  9. 9

    PythonのNameError、名前が定義されていません

  10. 10

    vuejsが作成したフック:window / localstorageが定義されていません

  11. 11

    Python、エラー:「関数が定義されていません」、

  12. 12

    Angular2 5分のインストールバグ-要件が定義されていません

  13. 13

    Python NameError:名前 'include'が定義されていません

  14. 14

    Python NameError:名前が定義されていません

  15. 15

    Python NameError:名前が定義されていません

  16. 16

    Python JSON:NameError:名前 'false'が定義されていません

  17. 17

    Python:NameError:名前 'u'が定義されていません

  18. 18

    Python3.5-名前「await」が定義されていません

  19. 19

    Python 3:NameError:名前 'sklearn'が定義されていません

  20. 20

    Python Django NameError:名前 'datetime'が定義されていません

  21. 21

    NameError:名前 'logged'が定義されていません、Flask Python

  22. 22

    Python:名前 'set_password'が定義されていません

  23. 23

    Python NameError:名前 ''が定義されていません

  24. 24

    NameError:名前 'x'が定義されていません(Python 3.7)

  25. 25

    Python クラス: ラムダ名エラー - 名前が定義されていません

  26. 26

    Pythonのnamerror名が定義されていません

  27. 27

    Python 2.7 @propertyを使用すると、「グローバル名 '_c__pro'が定義されていません」というエラーが発生します

  28. 28

    Pythonモジュールで名前が定義されていません

  29. 29

    Pythonの名前エラー:NameError:名前 '宝石'が定義されていません

ホットタグ

アーカイブ