Обратите внимание, что неработающая программа не помогает, вы, вероятно, используете какую-то IDE, часто IDE не обрабатывают эти типы ошибок правильно, поэтому я рекомендую вам выполнить ее в CMD, если вы это сделаете, вы получитеследующее сообщение:
Traceback (most recent call last):
File "/path/of/Test2.py", line 6, in exIpDomInv_clicked
MainWindow1.hide()
NameError: name 'MainWindow1' is not defined
Aborted (core dumped)
Ну, более или менее, оно дает нам представление о проблеме, говорит о том, что MainWindow1 не определено, и это заставляет меня думать, что вы не совсем понимаете некоторые понятия:
Выражение if __name__ == "__main__":
может иметь все файлы, но наблюдается только первый, так что if __name__ == "__main__":
Test2.py не будет запущен и, следовательно, MainWindow1, который вы предполагаетесуществует не будет существовать.
Классы являются абстракциями, то есть они описывают поведение своих объектов, кроме того, они получают доступ только к членам своей области видимости, то есть это похоже на черный ящик, еслиобъект не определен внутри класса, к нему нельзя получить доступ, поэтому, если вы хотите получить доступ к Ui_MainWindow из Test.py, вы не можете сделать это напрямую, как есть, естьЕсть несколько методов для достижения этой цели, но это основано на вышеприведенном.
С другой стороны, классам, которые генерируют Qt Designer, рекомендуется не редактировать их, потому что если вы что-то изменили в.Пользовательский интерфейс и перекомпиляция будут стереть все изменения, кроме того, они не являются виджетами, поэтому у вас есть ограничения, такие как перезапись методов.Для получения дополнительной информации прочитайте это .
Учитывая вышеизложенное, я собираюсь разделить его на несколько файлов:
ui_mainwindow1.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow1(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(412, 440)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.exIpDomInv = QtWidgets.QPushButton(self.centralwidget)
self.exIpDomInv.setObjectName("exIpDomInv")
self.verticalLayout.addWidget(self.exIpDomInv)
MainWindow.setCentralWidget(self.centralwidget)
self.Menu = QtWidgets.QMenuBar(MainWindow)
self.Menu.setGeometry(QtCore.QRect(0, 0, 412, 31))
self.Menu.setObjectName("Menu")
MainWindow.setMenuBar(self.Menu)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Investigation"))
MainWindow.setAccessibleName(_translate("MainWindow", "InvestigationMenu"))
self.exIpDomInv.setText(_translate("MainWindow", "External IP/ Domain Investigation"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow1 = QtWidgets.QMainWindow()
ui2 = Ui_MainWindow1()
ui2.setup(MainWindow1)
MainWindow1.show()
sys.exit(app.exec_())
ui_mainwindow.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(412, 440)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 412, 31))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
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", "Investigation"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
main.py
from PyQt5 import QtWidgets
from ui_mainwindow1 import Ui_MainWindow1
from ui_mainwindow import Ui_MainWindow
class MainWindow1(QtWidgets.QMainWindow, Ui_MainWindow1):
def __init__(self, parent=None):
super(MainWindow1, self).__init__(parent)
self.setupUi(self)
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.other_window = MainWindow1()
self.pushButton.clicked.connect(self.other_window.show)
self.other_window.exIpDomInv.clicked.connect(self.hide)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Как вы видите, объект other_window находится в той же области видимости классатак что к нему можно получить доступ и, следовательно, все элементы определены.Также каждый файл имеет if __name__ == "__main__":
, они служат для проверки работы каждого класса, но будет выполняться только один файл в main.py, остальные будут игнорироваться.