База данных в PyQt5

Есть 2 кода. В первом 2 кнопки: список фильмов и список сериалов. Во втором коде база данных со списком фильмов. Помогите объединить эти 2 кода так, что бы при нажатии на кнопку список фильмов, вылазила таблица со списком фильмов(второй код).

Вот первый код:

import sys

from PyQt5.QtWidgets import QWidget, QLabel, QPushButton, QLineEdit, QApplication, QMainWindow


class Films(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.Films_button = QPushButton('список фильмов', self)
        self.Films_button.resize(200, 100)
        self.Films_button.move(300, 500)

        self.Serials_button = QPushButton('список сериалов', self)
        self.Serials_button.resize(200, 100)
        self.Serials_button.move(300, 200)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Films()
    ex.show()
    sys.exit(app.exec_())

Вот второй код с базой данных:

import sys

from PyQt5.QtSql import *
from PyQt5.QtWidgets import *


class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        db = QSqlDatabase.addDatabase('QSQLITE')
        db.setDatabaseName('films_db.sqlite')
        db.open()
        view = QTableView(self)
        model = QSqlTableModel(self, db)
        model.setTable('films')
        model.select()

        view.setModel(model)
        view.move(10, 10)
        view.resize(617, 315)

        self.setGeometry(300, 100, 650, 450)
        self.setWindowTitle('Пример')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec())

Вот этот код пытаюсь соединить:

import sys
from PyQt5 import QtMultimedia, QtCore
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QWidget, QLabel, QPushButton, QLineEdit, QApplication, QMainWindow
from PyQt5.QtWidgets import QWidget, QTableView, QDialog, QPushButton, QApplication, QVBoxLayout
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel


class Films(QDialog):
    def __init__(self, parent):
        super().__init__(parent)

        self.setWindowTitle('Films')

        main_layout = QVBoxLayout()

        self.model = QSqlTableModel(self)
        self.model.setTable('films')

        self.view_films = QTableView()
        self.view_films.setModel(self.model)

        main_layout.addWidget(self.view_films)
        
        self.setLayout(main_layout)

    def refresh(self):
        self.model.select()


class Guitar(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

        self.db = QSqlDatabase.addDatabase('QSQLITE')
        self.db.setDatabaseName('films_db.sqlite')
        self.db.open()

        self.initUI()

    def initUI(self):
        main_layout = QVBoxLayout()
        self.setGeometry(250, 55, 1200, 800)
        self.setWindowTitle('Гитара')

        self.Accords_button = QPushButton('список аккордов', self)
        self.Accords_button.resize(200, 100)
        self.Accords_button.move(300, 500)
        self.Accords_button.clicked.connect(self._show_films)

        self.Songs_button = QPushButton('список песен', self)
        self.Songs_button.resize(200, 100)
        self.Songs_button.move(300, 200)

        main_layout.addWidget(self.Accords_button)
        main_layout.addWidget(self.Songs_button)

        self.setLayout(main_layout)

    def _show_films(self):
        films = Films(self)
        films.refresh()
        films.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Guitar()
    ex.show()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: gil9red

Объединил виджеты и логику двух виджетов в одном. Для размещения виджетов использовал компоновщик, вместо ручного указания

Попробуйте:

import sys

from PyQt5.QtWidgets import QWidget, QTableView, QPushButton, QApplication, QVBoxLayout
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.db = QSqlDatabase.addDatabase('QSQLITE')
        self.db.setDatabaseName('films_db.sqlite')
        self.db.open()

        self.initUI()

    def initUI(self):
        main_layout = QVBoxLayout()

        self.button_films = QPushButton('список фильмов')
        self.button_films.clicked.connect(self._show_films)

        self.button_serials = QPushButton('список сериалов')

        self.model_films = QSqlTableModel(self, self.db)
        self.model_films.setTable('films')

        self.view_films = QTableView()
        self.view_films.setModel(self.model_films)

        main_layout.addWidget(self.button_films)
        main_layout.addWidget(self.button_serials)
        main_layout.addWidget(self.view_films)

        self.setLayout(main_layout)

    def _show_films(self):
        self.model_films.select()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())

UPD. Открытие в отдельном окне:

import sys

from PyQt5.QtWidgets import QWidget, QTableView, QDialog, QPushButton, QApplication, QVBoxLayout
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel


class Films(QDialog):
    def __init__(self, parent):
        super().__init__(parent)
        
        self.setWindowTitle('Films')
        
        main_layout = QVBoxLayout()

        self.model = QSqlTableModel(self)
        self.model.setTable('films')

        self.view_films = QTableView()
        self.view_films.setModel(self.model)

        main_layout.addWidget(self.view_films)

        self.setLayout(main_layout)

    def refresh(self):
        self.model.select()


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.db = QSqlDatabase.addDatabase('QSQLITE')
        self.db.setDatabaseName('films_db.sqlite')
        self.db.open()

        self.initUI()

    def initUI(self):
        main_layout = QVBoxLayout()

        self.button_films = QPushButton('список фильмов')
        self.button_films.clicked.connect(self._show_films)

        self.button_serials = QPushButton('список сериалов')

        main_layout.addWidget(self.button_films)
        main_layout.addWidget(self.button_serials)

        self.setLayout(main_layout)

    def _show_films(self):
        films = Films(self)
        films.refresh()
        films.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())
→ Ссылка