Как открыть окно по кнопке из другого окна?

Рейтинг: 1Ответов: 1Опубликовано: 19.03.2023

Я уже умею открывать окна созданные в дизайнере из другого такого же окна по кнопке. Но тут пришлось одно (зависимое) окно создавать внутри кода.
Теперь никак не могу его открыть из главного окна, точнее что-то на заднем фоне отрывается и сразу закрывается (в моем примере).

Подскажите выход.

main.py

from PyQt5 import QtCore, QtGui, QtWidgets
# from table11 import main5
class Ui_MainWindow1(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(300, 200)
        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")
        MainWindow.setCentralWidget(self.centralwidget)
        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", "Открыть таблицу"))
        self.pushButton.setGeometry(0,0,150,30)


class MyWin(QtWidgets.QMainWindow, Ui_MainWindow1):
    def __init__(self):
        super(MyWin, self).__init__()
        self.setupUi(self)

        self.pushButton.clicked.connect(self.ggg)

    def ggg(self):
        from table11 import main5
        main5(sys.argv)

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

table.py

from PyQt5.QtCore import QFile, QFileInfo, Qt
from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import QApplication, QHeaderView, QTableView, QLabel, QMainWindow, QPushButton, QToolBar, QAction
from ctypes  import windll
widht_mon = round(windll.user32.GetSystemMetrics(0)/2)
height_mon = windll.user32.GetSystemMetrics(1)
import sys


class Window2(QMainWindow):
    def __init__(self, parent=None):
        super().__init__()
        self.setWindowTitle("TABLE")
        self.resize(800, 800)
        self.createActions()
        self.createToolBars()
    def createActions(self):
        self.newAction = QAction( "&New", self)
        self.openAction = QAction( "&Open...", self)
        self.saveAction1 = QAction( "&Save", self)
        self.saveAction2 = QAction("&SaveAsEx", self)
        self.saveAction3 = QAction("&SaveAsLog", self)

    def createToolBars(self):
        fileToolBar = self.addToolBar("File")
        fileToolBar.addAction(self.newAction)
        fileToolBar.addAction(self.openAction)
        fileToolBar.addAction(self.saveAction1)
        fileToolBar.addAction(self.saveAction2)
        fileToolBar.addAction(self.saveAction3)




class FreezeTableWidget(QTableView):
    def __init__(self, model):
        super().__init__()
        self.setModel(model)
        self.frozenTableView = QTableView(self)
        self.init()
        self.frozenTableView.horizontalScrollBar().valueChanged.connect(
            self.horizontalScrollBar().setValue)
        self.horizontalScrollBar().valueChanged.connect(
            self.frozenTableView.horizontalScrollBar().setValue)

    def init(self):
        self.frozenTableView.setModel(self.model())
        self.horizontalHeader().sectionResized.connect(self.updateSectionWidth)
        self.frozenTableView.setFocusPolicy(Qt.NoFocus)
        self.frozenTableView.horizontalHeader().hide()
        self.frozenTableView.verticalHeader().verticalOffset()
        self.frozenTableView.verticalHeader().setFixedWidth(100)
        self.frozenTableView.verticalHeader().setSectionResizeMode(QHeaderView.Fixed)
        self.viewport().stackUnder(self.frozenTableView)
        self.frozenTableView.setStyleSheet('''
            QTableView { border: none;
                         background-color: #8EDE21;
                         selection-background-color: #999;
            }''') # for demo purposes
        self.frozenTableView.setSelectionModel(self.selectionModel())
        for row1 in range(3, self.model().rowCount()):
            self.frozenTableView.setRowHidden(row1, True)
        self.frozenTableView.setColumnWidth(0, self.columnWidth(0))
        self.frozenTableView.setHorizontalScrollBarPolicy(1)
        self.frozenTableView.setVerticalScrollBarPolicy(1)
        self.frozenTableView.show()
        self.updateFrozenTableGeometry()
        self.setHorizontalScrollMode(self.ScrollPerPixel)
        self.setVerticalScrollMode(self.ScrollPerPixel)
        self.frozenTableView.setVerticalScrollMode(self.ScrollPerPixel)
        self.frozenTableView.setHorizontalScrollMode(self.ScrollPerPixel)


    def updateSectionWidth(self, logicalIndex, newSize):
        self.frozenTableView.setColumnWidth(logicalIndex, newSize)
    def resizeEvent(self, event):
        super(FreezeTableWidget, self).resizeEvent(event)
        self.updateFrozenTableGeometry()
    def updateFrozenTableGeometry(self):
        self.frozenTableView.setGeometry(
            self.frameWidth(),
            self.horizontalHeader().height(), self.viewport().width()+95,
            3*self.rowHeight(0))

def main5(args):
    def split_and_strip(s, splitter):
        return [s.strip() for s in line.split(splitter)]
    app5 = QApplication(args)
    model = QStandardItemModel()
    file = QFile(QFileInfo(__file__).absolutePath() + '/tables11.txt')
    if file.open(QFile.ReadOnly):
        line = file.readLine(1000).decode('utf-8')
        header = split_and_strip(line, ',')
        model.setVerticalHeaderLabels(header)
        row = 0
        while file.canReadLine():
            line = file.readLine(1000).decode('utf-8')
            if not line.startswith('#') and ',' in line:
                fields = split_and_strip(line, ',')
                for col, field in enumerate(fields):
                    newItem = QStandardItem(field)
                    model.setItem(row, col, newItem)
                row += 1
    file.close()
    tableView = FreezeTableWidget(model)
    tableView.setWindowTitle("Frozen Column Example")
    tableView.resize(widht_mon, height_mon)
    tableView.verticalHeader().setFixedWidth(100)
    win = Window2()
    win.setCentralWidget(tableView)
    win.resize(widht_mon, height_mon)
    win.show()

    sys.exit(app5.exec_())

main5(sys.argv)

tables11.txt

Параметр1, Параметр2, Параметр3,  , Разъем11, Разъем12, Разъем13, Разъем13, Разъем14, Разъем15, Разъем16, Разъем17, Разъем18, Разъем19 , , Разъем21, Разъем22, Разъем23, Разъем24, Разъем25, Разъем26 , Разъем27, Разъем28, Разъем29, , Разъем31, Разъем32, Разъем33 , Разъем34, Разъем35, Разъем36, Разъем37, Разъем38, Разъем39, , Разъем41, Разъем42 , Разъем43, Разъем44

1,   , 5.2,   ,   , I , I ,   ,   , I
2,   , 5.3,   ,   , II , II , 11,   , II
3, 3, 5.4,   ,   , III , III , 12,   , I
,
4, 4, 5.5, 4a , VD , IV , IV , 12,   , III
5, 5-, 5.6,   , S , V- , V , 13, 5-, II
5, 5, 5.7, 4b , HS , V , VI , 14, 5, IV
6,   ,   , 4c ,   , V+ ,   , 15,   ,  
7, 5+, 5.8,   , VS , VI- , VIIa , 16, 5, IV
8, 6-, 5.9, 5a , HVS , VI , VIIb , 17,   , V
9, 6-/6 , 5.10a ,   , E1 , VI+ , VIIc , 18, 6-, VI
10,   , 5.10b , 5b ,   ,   ,   , 19,   , VI/VI+
11, 6, 5.10c ,   , E2 , VII- , VIIIa , 20, 6, V
12, 6+, 5.10d , 5c ,   , VII , VIIIb , 21,   , V
,
13, 7-, 5.11a ,   , E3 , VII+ , VIIIc , 22, 6, 7
14, 7, 5.11b ,   ,   ,   ,   , 23,   , 7b
15, 7+, 5.11c , 6a , E4 , VIII- , IXa , 24, 7-, 7
16, 7+/8- , 5.11d ,   ,   , VIII , IXb ,   , , 7c
17, 8-, 5.12a ,   , E5 , VIII+ , IXc , 25, 7, 8a
18, 8, 5.12b , 6b ,   ,   ,   , 26, 8-, 8b
19, 8/8+ , 5.12c ,   , E6 , IX- , Xa , 27, 8, 8c
20, 8+, 5.12d , 6c ,   , IX , Xb , 28, 8, 9a
21, 9-, 5.13a ,   , E7 , IX+ , Xc , 29, 9-, 9b
,
22, 9-, 5.13a ,   , E7 , IX+ , Xc , 29, 9-, 9b
23, 9-, 5.13a ,   , E7 , IX+ , Xc , 29, 9-, 9b
24, 9-, 5.13a ,   , E7 , IX+ , Xc , 29, 9-, 9b
25, 9-, 5.13a ,   , E7 , IX+ , Xc , 29, 9-, 9b
26, 9-, 5.13a ,   , E7 , IX+ , Xc , 29, 9-, 9b

Ответы

▲ 1Принят

Я переписал для вас модуль table.py так как он должен выглядеть и отметил изменения, которые внес.

main.py

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

# from table11 import main5
from table import Window2                                       # !!! +++


class Ui_MainWindow1(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(300, 200)
        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")
        MainWindow.setCentralWidget(self.centralwidget)
        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", "Открыть таблицу"))
        self.pushButton.setGeometry(0,0,150,30)


class MyWin(QtWidgets.QMainWindow, Ui_MainWindow1):
    def __init__(self):
        super(MyWin, self).__init__()
        self.setupUi(self)

        self.pushButton.clicked.connect(self.ggg)
        
        self.window2 = Window2()                               # !!! +++

    def ggg(self):
#        from table11 import main5
#        main5(sys.argv)
        self.window2.show()                                    # !!! +++
        

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

table.py

import sys
from ctypes  import windll
from PyQt5.QtCore import QFile, QFileInfo, Qt
from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import QApplication, QHeaderView, QTableView, \
    QLabel, QMainWindow, QPushButton, QToolBar, QAction


widht_mon = round(windll.user32.GetSystemMetrics(0)/2)
height_mon = windll.user32.GetSystemMetrics(1)


class FreezeTableWidget(QTableView):
    def __init__(self, model):
        super().__init__()
        self.setModel(model)
        self.frozenTableView = QTableView(self)
        self.init()
        self.frozenTableView.horizontalScrollBar().valueChanged.connect(
            self.horizontalScrollBar().setValue)
        self.horizontalScrollBar().valueChanged.connect(
            self.frozenTableView.horizontalScrollBar().setValue)

    def init(self):
        self.frozenTableView.setModel(self.model())
        self.horizontalHeader().sectionResized.connect(self.updateSectionWidth)
        self.frozenTableView.setFocusPolicy(Qt.NoFocus)
        self.frozenTableView.horizontalHeader().hide()
        self.frozenTableView.verticalHeader().verticalOffset()
        self.frozenTableView.verticalHeader().setFixedWidth(100)
        self.frozenTableView.verticalHeader().setSectionResizeMode(
            QHeaderView.Fixed)
        self.viewport().stackUnder(self.frozenTableView)
        self.frozenTableView.setStyleSheet('''
            QTableView { border: none;
                         background-color: #8EDE21;
                         selection-background-color: #999;
            }
        ''') # for demo purposes
        self.frozenTableView.setSelectionModel(self.selectionModel())
        for row1 in range(3, self.model().rowCount()):
            self.frozenTableView.setRowHidden(row1, True)
        self.frozenTableView.setColumnWidth(0, self.columnWidth(0))
        self.frozenTableView.setHorizontalScrollBarPolicy(1)
        self.frozenTableView.setVerticalScrollBarPolicy(1)
        self.frozenTableView.show()
        self.updateFrozenTableGeometry()
        self.setHorizontalScrollMode(self.ScrollPerPixel)
        self.setVerticalScrollMode(self.ScrollPerPixel)
        self.frozenTableView.setVerticalScrollMode(self.ScrollPerPixel)
        self.frozenTableView.setHorizontalScrollMode(self.ScrollPerPixel)

    def updateSectionWidth(self, logicalIndex, newSize):
        self.frozenTableView.setColumnWidth(logicalIndex, newSize)
        
    def resizeEvent(self, event):
        super(FreezeTableWidget, self).resizeEvent(event)
        self.updateFrozenTableGeometry()
        
    def updateFrozenTableGeometry(self):
        self.frozenTableView.setGeometry(
            self.frameWidth(),
            self.horizontalHeader().height(), 
            self.viewport().width() + 95,
            3 * self.rowHeight(0)
        )


class Window2(QMainWindow):
    def __init__(self, parent=None):
        super().__init__()
        self.setWindowTitle("TABLE")
        self.resize(800, 800)
        self.createActions()
        self.createToolBars()
        
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        model = QStandardItemModel()
        file = QFile(QFileInfo(__file__).absolutePath() + '/tables11.txt')

        if file.open(QFile.ReadOnly):
            line = file.readLine(1000).decode('utf-8')
            header = self.split_and_strip(line, ',')
            model.setVerticalHeaderLabels(header)
            row = 0

            while file.canReadLine():
                line = file.readLine(1000).decode('utf-8')
                if not line.startswith('#') and ',' in line:
                    fields = self.split_and_strip(line, ',')
                    for col, field in enumerate(fields):
                        newItem = QStandardItem(field)
                        model.setItem(row, col, newItem)
                    row += 1
        file.close()
# ----> vvvv <-----------------------------------------------------------        
        self.tableView = FreezeTableWidget(model)
        self.tableView.setWindowTitle("Frozen Column Example")
        self.tableView.resize(widht_mon, height_mon)
        self.tableView.verticalHeader().setFixedWidth(100)
        
#        win = Window2()
# ----> vvvv <-----------------------------------------------------------
        self.setCentralWidget(self.tableView)
        self.resize(widht_mon, height_mon)        
# ----> ^^^^ <-----------------------------------------------------------
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        
        
        
    def createActions(self):
        self.newAction = QAction( "&New", self)
        self.openAction = QAction( "&Open...", self)
        self.saveAction1 = QAction( "&Save", self)
        self.saveAction2 = QAction("&SaveAsEx", self)
        self.saveAction3 = QAction("&SaveAsLog", self)

    def createToolBars(self):
        fileToolBar = self.addToolBar("File")
        fileToolBar.addAction(self.newAction)
        fileToolBar.addAction(self.openAction)
        fileToolBar.addAction(self.saveAction1)
        fileToolBar.addAction(self.saveAction2)
        fileToolBar.addAction(self.saveAction3)

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
#    def split_and_strip(self, s, splitter):
#        return [s.strip() for s in line.split(splitter)] 
# --------------------------> vvvv <-----------------------------------       
    def split_and_strip(self, line, splitter):
        return [s.strip() for s in line.split(splitter)]   
# -------------------------------> ^^^^ <------------------------------
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    window = Window2()
    window.show()
    sys.exit(app.exec_())

введите сюда описание изображения