Кнопка и функция не работают во втором окне приложения PyQt5

#python-3.x #pyqt5

Вопрос:

В моем приложении у меня есть 2 окна qmain. Файл пользовательского интерфейса, созданный с помощью pyuic5 и сохраненный в отдельных файлах. Когда я нажимаю кнопку в главном окне, открывается второе окно, называемое блок-окном. В этом окне в функции инициализации хранится метод «loaddata», и он загружает данные в QTableWidget. Однако, когда вы открываете второе окно, ничего не происходит. Но если вы отлаживаете отдельно файл BlockWindow(второе окно), он отлично работает. Можете ли вы подсказать, в чем на самом деле проблема?

MainWindow.py

 from MainWindowUI import Ui_MainWindow
from BlockWindowUI import Ui_BlockWindow

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent = None):
        super(MainWindow, self).__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.pushButton.clicked.connect(self.loaddata)
        self.ui.action.triggered.connect(self.openJournal)
        self.ui.action_4.triggered.connect(exit)
        self.ui.label_2 = QLabel('<h1 style="color: rgb(255, 255, 255);"></h1>')
        self.loaddata()

   def loaddata(self):
        conn = pyodbc.connect(
            "Driver={ODBC Driver 17 for SQL Server};Server=DESKTOP-49J58F3SQLEXPRESS;Database=Plan;Trusted_Connection=yes;")
        query = "SELECT nn, name, metering, volume, date_end, responsible, txt_name from dbo.Card_plan"
        result = conn.execute(query).fetchall()
        self.ui.tableWidget.clearSelection()
        self.ui.tableWidget.setRowCount(0)
        for row_number, row_data in enumerate(result):
            self.ui.tableWidget.insertRow(row_number)
            for column_number, data in enumerate(row_data):
                self.ui.tableWidget.setItem(row_number, column_number, QtWidgets.QTableWidgetItem(str(data)))
        conn.commit()

    def openJournal(self):
        self.BlockWindow = QtWidgets.QMainWindow()
        self.ui = Ui_BlockWindow()
        self.ui.setupUi(self.BlockWindow)
        self.BlockWindow.show()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
 

BlockWindow.py

 from BlockWindowUI import *

class BlockWindow(QtWidgets.QMainWindow, Ui_BlockWindow):
    def __init__(self):
        super(BlockWindow, self).__init__()
        self.ui = Ui_BlockWindow()
        self.ui.setupUi(self)
        self.ui.pushButton_3.clicked.connect(self.dels)
        self.ui.pushButton_4.clicked.connect(BlockWindow.close)
        self.ui.label_2 = QLabel('<h1 style="color: rgb(255, 255, 255);"></h1>')
        self.loaddata()

    def loaddata(self):
        conn = pyodbc.connect(
            "Driver={ODBC Driver 17 for SQL Server};Server=DESKTOP-49J58F3SQLEXPRESS;Database=Plan;Trusted_Connection=yes;")
        query = "SELECT * from dbo.Block"
        result = conn.execute(query).fetchall()
        self.ui.tableWidget.setRowCount(0)
        for row_number, row_data in enumerate(result):
            self.ui.tableWidget.insertRow(row_number)
            for column_number, data in enumerate(row_data):
                self.ui.tableWidget.setItem(row_number, column_number, QtWidgets.QTableWidgetItem(str(data)))
        conn.commit()
 

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

1. Я полагаю, что ваша ошибка в этой строке self.BlockWindow = QtWidgets.QMainWindow() . На самом деле вы никогда не используете свой пользовательский класс, кроме класса по умолчанию.

2. @mapf хорошо, вы можете помочь, как мне на самом деле нужно это заменить?

Ответ №1:

В своем MainWindow классе попробуйте изменить свой openJournal метод на этот:

     def openJournal(self):
        self.BlockWindow = BlockWindow()
        self.BlockWindow.show()
 

И не забудьте импортировать свой класс в MainWindow.py:

 from BlockWindow import BlockWindow