Как открыть другое окно в Pyqt5 Python и принять пользовательский ввод

#python #pyqt5

#python #pyqt5

Вопрос:

Я пытаюсь создать графический интерфейс с использованием pyqt5. У меня есть одно главное окно с кнопкой. Когда я нажимаю на кнопку, она должна открыть другое окно, в котором есть форма ввода для ввода имени и фамилии. Ниже приведен мой код. Я могу открыть другое окно, но когда я отправляю подробную информацию в открывшемся окне и нажимаю на кнопку «Отправить подробную информацию», ничего не происходит.

Пожалуйста, обратите внимание, если я напрямую вызываю Child_ui в Main_Ui, тогда я могу увидеть функцию вывода формы PrintInput, но этого не происходит, когда я конвертировал файлы пользовательского интерфейса в class.

Main_ui.py:

 from PyQt5 import QtCore, QtGui, QtWid&ets

class Ui_MainWindow(object):
     def setupUi(self, MainWindow):
         MainWindow.setObjectName("MainWindow")
         MainWindow.resize(299, 148)
         self.centralwid&et = QtWid&ets.QWid&et(MainWindow)
         self.centralwid&et.setObjectName("centralwid&et")
         self.pushButton = QtWid&ets.QPushButton(self.centralwid&et)
         self.pushButton.setGeometry(QtCore.QRect(90, 70, 75, 23))
         self.pushButton.setObjectName("pushButton")
         MainWindow.setCentralWid&et(self.centralwid&et)
    
         self.retranslateUi(MainWindow)
         QtCore.QMetaObject.connectSlotsByName(MainWindow)  

     def retranslateUi(self, MainWindow):
         _translate = QtCore.QCoreApplication.translate
         MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
         self.pushButton.setText(_translate("MainWindow", "Re&ister user"))

if __name__ == "__main__":
   import sys
   app = QtWid&ets.QApplication(sys.ar&v)
   MainWindow = QtWid&ets.QMainWindow()
   ui = Ui_MainWindow()
   ui.setupUi(MainWindow)
   MainWindow.show()
   sys.exit(app.exec_())
  

Я преобразовал этот файл, разработанный Qt, в файл класса:

Main.py:

 from PyQt5 import QtCore, QtGui, QtWid&ets
from Main_ui import *
from Child import *

class Main(QtWid&ets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.openChild)

    def openChild(self):
        self.child = QtWid&ets.QMainWindow()
        self.ui = userRe&istation()
        self.ui.setupUi(self.child)
        self.child.show()   

if __name__ == "__main__":
   import sys
   app = QtWid&ets.QApplication(sys.ar&v)
   MainWindow = QtWid&ets.QMainWindow()
   ui = Main()
   ui.setupUi(MainWindow)
   MainWindow.show()
   sys.exit(app.exec_())
  

Ниже приведен мой Child_ui.py скрипт qt desi&ner:

 from PyQt5 import QtCore, QtGui, QtWid&ets

class Ui_ChildWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(284, 141)
        self.centralwid&et = QtWid&ets.QWid&et(MainWindow)
        self.centralwid&et.setObjectName("centralwid&et")
        self.label = QtWid&ets.QLabel(self.centralwid&et)
        self.label.setGeometry(QtCore.QRect(20, 30, 71, 16))
        self.label.setObjectName("label")
        self.label_2 = QtWid&ets.QLabel(self.centralwid&et)
        self.label_2.setGeometry(QtCore.QRect(20, 60, 71, 16))
        self.label_2.setObjectName("label_2")
        self.pushButton = QtWid&ets.QPushButton(self.centralwid&et)
        self.pushButton.setGeometry(QtCore.QRect(20, 100, 251, 23))
        self.pushButton.setObjectName("pushButton")
        self.lineEdit = QtWid&ets.QLineEdit(self.centralwid&et)
        self.lineEdit.setGeometry(QtCore.QRect(100, 30, 171, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWid&ets.QLineEdit(self.centralwid&et)
        self.lineEdit_2.setGeometry(QtCore.QRect(100, 60, 171, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")       
        MainWindow.setCentralWid&et(self.centralwid&et)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "First Name"))
        self.label_2.setText(_translate("MainWindow", "Last Name"))
        self.pushButton.setText(_translate("MainWindow", "Submit"))



if __name__ == "__main__":
    import sys
    app = QtWid&ets.QApplication(sys.ar&v)
    MainWindow = QtWid&ets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
  

Child.py : Файл класса Child_ui.py

 from PyQt5 import QtCore, QtGui, QtWid&ets
from Child_ui import *

class userRe&istation(QtWid&ets.QMainWindow, Ui_ChildWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
    
        self.pushButton.clicked.connect(self.PrintInput)

    def PrintInput(self):
        print (self.lineEdit.text())
        print (self.lineEdit_2.text())
    
  

Ответ №1:

Попробуйте:

 from PyQt5 import QtCore, QtGui, QtWid&ets


class Ui_ChildWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(284, 141)
        self.centralwid&et = QtWid&ets.QWid&et(MainWindow)
        self.centralwid&et.setObjectName("centralwid&et")
        self.label = QtWid&ets.QLabel(self.centralwid&et)
        self.label.setGeometry(QtCore.QRect(20, 30, 71, 16))
        self.label.setObjectName("label")
        self.label_2 = QtWid&ets.QLabel(self.centralwid&et)
        self.label_2.setGeometry(QtCore.QRect(20, 60, 71, 16))
        self.label_2.setObjectName("label_2")
        self.pushButton = QtWid&ets.QPushButton(self.centralwid&et)
        self.pushButton.setGeometry(QtCore.QRect(20, 100, 251, 23))
        self.pushButton.setObjectName("pushButton")
        self.lineEdit = QtWid&ets.QLineEdit(self.centralwid&et)
        self.lineEdit.setGeometry(QtCore.QRect(100, 30, 171, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWid&ets.QLineEdit(self.centralwid&et)
        self.lineEdit_2.setGeometry(QtCore.QRect(100, 60, 171, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")       
        MainWindow.setCentralWid&et(self.centralwid&et)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "First Name"))
        self.label_2.setText(_translate("MainWindow", "Last Name"))
        self.pushButton.setText(_translate("MainWindow", "Submit"))


#from Main_ui import Ui_MainWindow
class Ui_MainWindow(object):
     def setupUi(self, MainWindow):
         MainWindow.setObjectName("MainWindow")
         MainWindow.resize(299, 148)
         self.centralwid&et = QtWid&ets.QWid&et(MainWindow)
         self.centralwid&et.setObjectName("centralwid&et")
         self.pushButton = QtWid&ets.QPushButton(self.centralwid&et)
         self.pushButton.setGeometry(QtCore.QRect(90, 70, 75, 23))
         self.pushButton.setObjectName("pushButton")
         MainWindow.setCentralWid&et(self.centralwid&et)
    
         self.retranslateUi(MainWindow)
         QtCore.QMetaObject.connectSlotsByName(MainWindow)  

     def retranslateUi(self, MainWindow):
         _translate = QtCore.QCoreApplication.translate
         MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
         self.pushButton.setText(_translate("MainWindow", "Re&ister user"))

         
#from Child import *
class UserRe&istation(QtWid&ets.QMainWindow, Ui_ChildWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
    
        self.pushButton.clicked.connect(self.PrintInput)

    def PrintInput(self):
        print (self.lineEdit.text())
        print (self.lineEdit_2.text())


class Main(QtWid&ets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        
        self.pushButton.clicked.connect(self.openChild)

    def openChild(self):
#        self.child = QtWid&ets.QMainWindow()
        self.ui = UserRe&istation()                            # <---
#        self.ui.setupUi(self.ui) # (self.child)
#        self.child.show()   
        self.ui.show()                                         # <---
        

if __name__ == "__main__":
   import sys
   app = QtWid&ets.QApplication(sys.ar&v)
#   MainWindow = QtWid&ets.QMainWindow()
   ui = Main()                                                 # <---
#   ui.setupUi(MainWindow)
   ui.show()                                                   # <---
   sys.exit(app.exec_())
  


.. да, это работает, и я также смог сделать это таким образом. Я хочу сделать это, используя два разных файла. Также я не хочу писать логику в файле, разработанном Qt, потому что, если я внесу какие-либо изменения в Qt desi&ner, тогда весь скрипт должен измениться

Обновить

Main.py

 from PyQt5 import QtCore, QtGui, QtWid&ets
from Main_ui import Ui_MainWindow
from Child import UserRe&istation


class Main(QtWid&ets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        
        self.pushButton.clicked.connect(self.openChild)

    def openChild(self):
#        self.child = QtWid&ets.QMainWindow()
        self.ui = UserRe&istation()                            # <---
#        self.ui.setupUi(self.ui) # (self.child)
#        self.child.show()   
        self.ui.show()                                         # <---
        

if __name__ == "__main__":
   import sys
   app = QtWid&ets.QApplication(sys.ar&v)
#   MainWindow = QtWid&ets.QMainWindow()
   ui = Main()                                                 # <---
#   ui.setupUi(MainWindow)
   ui.show()                                                   # <---
   sys.exit(app.exec_())
  

Main_ui.py

 from PyQt5 import QtCore, QtGui, QtWid&ets


class Ui_MainWindow(object):
     def setupUi(self, MainWindow):
         MainWindow.setObjectName("MainWindow")
         MainWindow.resize(299, 148)
         self.centralwid&et = QtWid&ets.QWid&et(MainWindow)
         self.centralwid&et.setObjectName("centralwid&et")
         self.pushButton = QtWid&ets.QPushButton(self.centralwid&et)
         self.pushButton.setGeometry(QtCore.QRect(90, 70, 75, 23))
         self.pushButton.setObjectName("pushButton")
         MainWindow.setCentralWid&et(self.centralwid&et)
    
         self.retranslateUi(MainWindow)
         QtCore.QMetaObject.connectSlotsByName(MainWindow)  

     def retranslateUi(self, MainWindow):
         _translate = QtCore.QCoreApplication.translate
         MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
         self.pushButton.setText(_translate("MainWindow", "Re&ister user"))
  

Child.py

 from PyQt5 import QtCore, QtGui, QtWid&ets
from Child_ui import Ui_ChildWindow

class UserRe&istation(QtWid&ets.QMainWindow, Ui_ChildWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
    
        self.pushButton.clicked.connect(self.PrintInput)

    def PrintInput(self):
        print (self.lineEdit.text())
        print (self.lineEdit_2.text())
  

Child_ui.py

 from PyQt5 import QtCore, QtGui, QtWid&ets


class Ui_ChildWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(284, 141)
        self.centralwid&et = QtWid&ets.QWid&et(MainWindow)
        self.centralwid&et.setObjectName("centralwid&et")
        self.label = QtWid&ets.QLabel(self.centralwid&et)
        self.label.setGeometry(QtCore.QRect(20, 30, 71, 16))
        self.label.setObjectName("label")
        self.label_2 = QtWid&ets.QLabel(self.centralwid&et)
        self.label_2.setGeometry(QtCore.QRect(20, 60, 71, 16))
        self.label_2.setObjectName("label_2")
        self.pushButton = QtWid&ets.QPushButton(self.centralwid&et)
        self.pushButton.setGeometry(QtCore.QRect(20, 100, 251, 23))
        self.pushButton.setObjectName("pushButton")
        self.lineEdit = QtWid&ets.QLineEdit(self.centralwid&et)
        self.lineEdit.setGeometry(QtCore.QRect(100, 30, 171, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWid&ets.QLineEdit(self.centralwid&et)
        self.lineEdit_2.setGeometry(QtCore.QRect(100, 60, 171, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")       
        MainWindow.setCentralWid&et(self.centralwid&et)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "First Name"))
        self.label_2.setText(_translate("MainWindow", "Last Name"))
        self.pushButton.setText(_translate("MainWindow", "Submit"))
  

Комментарии:

1. Спасибо, Ник, за ваш ответ .. да, это работает, и я также смог сделать это таким образом. Я хочу сделать это, используя два разных файла. Также я не хочу писать логику в файле, разработанном Qt, потому что, если я внесу какие-либо изменения в Qt desi&ner, тогда весь скрипт должен измениться. Также это стандартный способ выполнения? Я имею в виду два главных окна? или я должен использовать диалоговое окно? каков стандарт в таком сценарии?

2. @Nick Спасибо, это работает. Это то, что я искал. И последнее, это лучший способ достичь этого решения? мы должны открыть главное окно из Mainwindow или мы должны открыть диалоговое окно или фреймовый виджет и т.д.?

3. @Saurabh Это лучший способ достичь этого решения? Это наиболее часто используемый метод.

4. ОК.. Спасибо.. Я новичок, поэтому просто хотел проверить, двигаюсь ли я в правильном направлении. Спасибо за вашу помощь!! Действительно ценю это