PyQt6:尝试打开第二个窗口会导致错误

问题描述 投票:0回答:1

我正在尝试在 PyQt6 中打开第二个窗口。我有两个文件 - main.py 和 UI_elements.py - 前者导入后者。

在main.py中:

app = QtWidgets.QApplication([])
window = MainWindow(Ui_Translate)
window.show()
app.exec()

在 UI_elements.py 中调用此:

class MainWindow(QtWidgets.QMainWindow):
   def __init__(self, ui_window):
       super().__init__()
       self.ui = ui_window()
       self.ui.setupUi(self)`

效果很好。但是,尝试打开一个新窗口,方法是(1)使用参数 Ui_Translate_Cycles 重复 main.py 代码,(2)使 Ui_Translate.Cycles 成为 Ui_Translate 的子级,或(3)完全创建一个新类:

class Widget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.ui = Ui_Translate_Cycle()
        self.ui.setupUi(self)

不起作用。

1 结果为

NameError: name 'MainWindow' is not defined. Did you mean: 'main_window'?

2 个结果为

AttributeError: 'Ui_Translate_Cycle' object has no attribute 'show'

3 个结果为

NameError: name 'Widget' is not defined. Did you mean: 'QtWidgets'?

非常感谢解决此问题的任何帮助。我是 PyQt6 的新手,因此对最佳实践的评论也将不胜感激 - 提前致谢。

MRE(注释2.py文件):

  • 主.py
import sys
from UI_elements import *

def main_script():
    app = QtWidgets.QApplication([])
    window = MainWindow(Ui_Translate)
    window.show()
    app.exec()

def run_cycles(main_window, english_input):
    number_of_cycles = english_input.blockCount()
    contents = english_input.toPlainText()
    new_window = Widget()
    new_window.show()

    print(f"number of cycles = {number_of_cycles}")
    for line in contents.splitlines():
        if line is not None:
            continue
        print("new line")

if __name__ == "__main__":
    sys.exit(main_script())
  • UI_elements.py
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, ui_window):
        super().__init__()
        self.ui = ui_window()
        self.ui.setupUi(self)

class Widget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.ui = Ui_Translate_Cycle()
        self.ui.setupUi(self)

class Ui_Translate(object):
    def setupUi(self, Translate):
        Translate.setObjectName("Translate")
        Translate.resize(600, 600)
        self.TranslateWidget = QtWidgets.QWidget(Translate)
        self.TranslateWidget.setObjectName("TranslateWidget")
        self.English_Input = QtWidgets.QPlainTextEdit(self.TranslateWidget)
        self.English_Input.setGeometry(QtCore.QRect(210, 70, 301, 381))
        self.English_Input.setObjectName("English_Input")
        self.Translate_Button = QtWidgets.QPushButton(self.TranslateWidget)
        self.Translate_Button.setGeometry(QtCore.QRect(40, 180, 130, 40))
        self.Translate_Button.setObjectName("Translate_Button")
        Translate.setCentralWidget(self.TranslateWidget)
        self.retranslateUi(Translate)
        QtCore.QMetaObject.connectSlotsByName(Translate)
        self.cycle_window = Ui_Translate_Cycle()
        self.Translate_Button.clicked.connect(lambda: main.run_cycles(self, self.English_Input))

    def retranslateUi(self, Translate):
        _translate = QtCore.QCoreApplication.translate
        Translate.setWindowTitle(_translate("Translate", "MainWindow"))
        self.Translate_Button.setText(_translate("Translate", "Translate"))

class Ui_Translate_Cycle(object):
    def setupUi(self, Translate_Cycle):
        Translate_Cycle.setObjectName("Translate_Cycle")
        Translate_Cycle.resize(600, 600)

    def retranslateUi(self, Translate_Cycle):
        _translate = QtCore.QCoreApplication.translate
        Translate_Cycle.setWindowTitle(_translate("Translate_Cycle", "Form"))
python pyqt6
1个回答
0
投票
  1. 错误:或者,您可以显式导入:

    from UI_elements import MainWindow, Ui_Translate

  2. 错误:在UI_elements.py中,应该从Ui_Translate类调用setupUi函数,即:

    Ui_Translate.setupUi(self)

  3. 错误:在main.py中,

    from PyQt6 import *

© www.soinside.com 2019 - 2024. All rights reserved.