#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. ОК.. Спасибо.. Я новичок, поэтому просто хотел проверить, двигаюсь ли я в правильном направлении. Спасибо за вашу помощь!! Действительно ценю это