gpt4 book ai didi

Python/PYQT5-隐藏菜单时崩溃,如果从主窗口运行

转载 作者:太空宇宙 更新时间:2023-11-04 04:32:48 27 4
gpt4 key购买 nike

已根据请求编辑代码

  • 我有一个程序,其中一个菜单将链接到另一个菜单,然后您可以从那里执行功能。

  • 当我向第二个窗口添加一个隐藏 MainWindow 函数时,它会在您按照提示操作时进入后台,如果您运行整个脚本,它会崩溃。例如:运行主脚本,单击调查,然后单击任何菜单项。

  • 如果我自己运行脚本,而不通过主菜单,它会正常运行。

  • 问题出在 Mainwindow.hide() 中,因为我可以在第二个菜单 - InvMenu 中将其注释掉,并且我可以从 MainMenu 运行该程序并按照提示操作,没有任何问题。

  • 我不确定如何解决这个问题。我在网上浏览了很多东西,但似乎都不起作用。

这是代码-

测试.py

    from PyQt5 import QtCore, QtGui, QtWidgets
from Test2 import *

class Ui_MainWindow(object):
def ipDombtn(self):
self.window=QtWidgets.QMainWindow()
self.ui=Ui_MainWindow1()
self.ui.setup(self.window)
self.window.show()


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)
self.pushButton.clicked.connect(self.ipDombtn)


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_())

这是第二个菜单的代码。它被设置为根据他们的选择调用特定的功能。如果我注释掉 MainWindow.hide(),我可以运行 MainMenu,选择调查,然后单击其中一个选项,它们就会起作用。如果我在不运行主菜单的情况下运行这段代码,并且没有任何注释掉,它就可以正常工作。两个菜单是否有问题,即使它们已重命名?

测试2.py

    from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow1(object):

def exIpDomInv_clicked(self):
MainWindow1.hide()
print("You clicked a button...")
MainWindow1.show()





def setup(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)

self.exIpDomInv.clicked.connect(self.exIpDomInv_clicked)



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_())

最佳答案

请注意,程序损坏没有帮助,您可能正在使用某些 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 将不存在。

  • 类是抽象的,即它们描述了对象的行为,此外它们只访问其范围内的成员,也就是说,它就像一个黑盒子,如果对象没有在类中定义,它就不能访问访问,所以如果你想访问Test.py的Ui_MainWindow,你不能直接访问,有几种方法可以实现,但都是基于上面的方法。

  • 另一方面,建议不要编辑生成 Qt Designer 的类,因为如果您在 .ui 中修改某些内容并重新编译,它将删除所有更改,此外它们不是小部件,因此您有这样的限制作为方法的覆盖。更多信息请阅读 this .

考虑到以上几点,我打算把它分成几个文件:

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_())

主.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中的一个会被执行,其他的将被忽略。

关于Python/PYQT5-隐藏菜单时崩溃,如果从主窗口运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52372134/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com