Обновить QGridLayout в PyQt6

Здраствуйте, програмисты!

У меня возник вопрос как обновить данные в QGrid. По задумке по нажатию кнопки обновить должны были удалятся все кнопки и добавлятся заново. Нужно чтобы при добавлении новых БД не закрывая приложение можно было получить заново ве БД. Ниже часть кода:

class MyTabWidget(QWidget):   
def __init__(self, parent):   
    super(QWidget, self).__init__(parent)  
    self.layout = QVBoxLayout(self)   
    self.tabs = QTabWidget()   
    self.tab1 = QWidget()   
    self.tab2 = QWidget()      
    self.tabs.addTab(self.tab1, "Главная")   
    self.tabs.addTab(self.tab2, "Инфо")    
    self.tab2.layout = QVBoxLayout(self.tab2)  # Устанавливаем layout для tab2
    self.tab1.layout = QVBoxLayout(self.tab1)  # Устанавливаем layout для tab1
    self.tab1.grid = QGridLayout()
    self.tab1.layout.addLayout(self.tab1.grid)
    self.layout.addWidget(self.tabs)   
    self.setLayout(self.layout)  


def db(self):
# tmp-file
    log = tmp.read()
    try:  
    # Подключение 
        conn = pymysql.connect(host='localhost', user=log[0], password=log[1])  
        with conn.cursor() as cursor: 
            button = QPushButton(
                icon=QIcon('./files/img/update.png'),
                text="Обновить"
                )  
            button.clicked.connect(lambda checked, : self.db()) 
            self.tab1.grid.addWidget(button) 
        # Базы данных
            cursor.execute('SHOW DATABASES')  
            databases = cursor.fetchall()

        # Создание кнопки создания базы данных  
            button = QPushButton(
                icon=QIcon('./files/img/plus.png'),
                text="  Создать базу данных"
                )  
            button.clicked.connect(lambda checked, : self.create_db(conn)) 
            self.tab1.grid.addWidget(button) 

        # Создание кнопок баз данных
            for database in databases:  
                db_name = database[0]  
                button = QPushButton(
                    icon=QIcon('./files/img/open.png'),
                    text="  " + db_name
                    )  
                button.clicked.connect(lambda checked, db=db_name: self.tab_db(conn, db))  
                text = QLabel("135")
                self.tab1.grid.addWidget(button)  
            self.tab1.grid.addWidget(text, 1, 1) 
            self.tab1.layout.addLayout(self.tab1.grid)
            self.tab1.setLayout(self.tab1.layout)  
            self.layout.addWidget(self.tabs)   
            self.setLayout(self.layout)   

            self.show()  

    finally:  
        if 'conn' in locals():  
            conn.close()    


def tab_db(self, conn, db):
    self.tabs.removeTab(1)
    self.tabs.addTab(self.tab1_db, "Структура {0}" .format(db))  
    self.tab1_db.layout = QVBoxLayout(self)

def create_db(self, conn):
    log = tmp.read()
    text, ok = QInputDialog.getText(self, 'Создание БД', 'Введите название базы данных:')
    if ok and text:
        try:
            conn = pymysql.connect(host='localhost', user=log[0], password=log[1])  
            with conn.cursor() as cursor: 
                cursor.execute('CREATE DATABASE {0}' .format(text))  
        except Error as e:
            self.erorr_msg = QMessageBox.warning(self, 'Ошибка', 'Ошибка MySQL: {0}' .format(e))

Например добавил с помощью кнопки Создать БД новую базу данных, а чтобы увидеть надо перезапускать приложение.

У разных ИИ спрашивал (DeepSeek, ChatGPT, YandexGPT), в интернете искал. Ничего не работает!!!

Просто дублируется всё теже кнопки, а старые не убираются. Или если убирать, то вообще пусто или ошибки по типу "Нету таковото элемента QVBoxLayout". Что делать?

И вот код всего приложения:

from pymysql import Error  
import pymysql
import os
import tmp
import sys   
from PyQt6.QtGui import * 
from PyQt6.QtWidgets import * 
from PyQt6.QtGui import *  
from PyQt6.QtWidgets import QMainWindow, QApplication, QPushButton, QWidget, QTabWidget, QVBoxLayout, QLabel
from PyQt6 import QtCore
from PyQt6.QtWidgets import QApplication  
from PyQt6.QtGui import QIcon  

tmp.new()

class MyTabWidget(QWidget):   
    def __init__(self, parent):   
        super(QWidget, self).__init__(parent)  
        self.layout = QVBoxLayout(self)   
        self.tabs = QTabWidget()   
        self.tab1 = QWidget()   
        self.tab2 = QWidget()      
        self.tabs.addTab(self.tab1, "Главная")   
        self.tabs.addTab(self.tab2, "Инфо")    
        self.tab2.layout = QVBoxLayout(self.tab2)  # Устанавливаем layout для tab2
        self.tab1.layout = QVBoxLayout(self.tab1)  # Устанавливаем layout для tab1
        self.tab1.grid = QGridLayout()
        self.tab1.layout.addLayout(self.tab1.grid)
        self.layout.addWidget(self.tabs)   
        self.setLayout(self.layout)  


    def db(self):
    # tmp-file
        log = tmp.read()
        try:  
        # Подключение 
            conn = pymysql.connect(host='localhost', user=log[0], password=log[1])  
            with conn.cursor() as cursor: 
                button = QPushButton(
                    icon=QIcon('./files/img/update.png'),
                    text="Обновить"
                    )  
                button.clicked.connect(lambda checked, : self.db()) 
                self.tab1.grid.addWidget(button) 
            # Базы данных
                cursor.execute('SHOW DATABASES')  
                databases = cursor.fetchall()

            # Создание кнопки создания базы данных  
                button = QPushButton(
                    icon=QIcon('./files/img/plus.png'),
                    text="  Создать базу данных"
                    )  
                button.clicked.connect(lambda checked, : self.create_db(conn)) 
                self.tab1.grid.addWidget(button) 

            # Создание кнопок баз данных
                for database in databases:  
                    db_name = database[0]  
                    button = QPushButton(
                        icon=QIcon('./files/img/open.png'),
                        text="  " + db_name
                        )  
                    button.clicked.connect(lambda checked, db=db_name: self.tab_db(conn, db))  
                    text = QLabel("135")
                    self.tab1.grid.addWidget(button)  
                self.tab1.grid.addWidget(text, 1, 1) 
                self.tab1.layout.addLayout(self.tab1.grid)
                self.tab1.setLayout(self.tab1.layout)  
                self.layout.addWidget(self.tabs)   
                self.setLayout(self.layout)   
 
                self.show()  

        finally:  
            if 'conn' in locals():  
                conn.close()    


    def tab_db(self, conn, db):
        self.tabs.removeTab(1)
        self.tabs.addTab(self.tab1_db, "Структура {0}" .format(db))  
        self.tab1_db.layout = QVBoxLayout(self)

    def create_db(self, conn):
        log = tmp.read()
        text, ok = QInputDialog.getText(self, 'Создание БД', 'Введите название базы данных:')
        if ok and text:
            try:
                conn = pymysql.connect(host='localhost', user=log[0], password=log[1])  
                with conn.cursor() as cursor: 
                    cursor.execute('CREATE DATABASE {0}' .format(text))  
            except Error as e:
                self.erorr_msg = QMessageBox.warning(self, 'Ошибка', 'Ошибка MySQL: {0}' .format(e))

        
class Dlg(QDialog):
    def __init__(self, window):  
        super().__init__()  
        self.window = window 
        self.initUI()  

    def initUI(self):   
        self.loginl = QLabel(self)  
        self.loginl.setFont(QFont('Arial', 15))  
        self.loginl.setText("Введите логин")  
        self.loginl.move(160, 20)  
        self.logint = QLineEdit(self)  
        self.logint.move(50, 60)  
        self.logint.resize(400, 40)   
        self.passl = QLabel(self)  
        self.passl.setFont(QFont('Arial', 15))  
        self.passl.setText("Введите пароль")  
        self.passl.move(160, 120)  
        self.passt = QLineEdit(self)  
        self.passt.setEchoMode(QLineEdit.EchoMode.Password) 
        self.passt.move(50, 160)  
        self.passt.resize(400, 40)   
        self.loginb = QPushButton("Войти", self)   
        self.loginb.setFont(QFont('Arial', 15))  
        self.loginb.move(170, 400)  
        self.loginb.resize(150, 50)   
        self.loginb.clicked.connect(self.conect_db)  
        self.errorpl = QLabel(self)
        self.setWindowTitle("Вход")  
        self.resize(500, 500)  
        self.setWindowFlags(self.windowFlags() & (~QtCore.Qt.WindowType.WindowContextHelpButtonHint))    
        self.show()  

    def conect_db(self):  
        login = self.logint.text()  
        password = self.passt.text()  
        try:  
            conn = pymysql.connect(host='localhost', user=login, password=password)  
            if conn:  
                tmp.write(login, password)
                self.window.tab_widget.db()
                self.accept() 
        except Error as e:  
            self.errorpl.setFont(QFont('Arial', 15))  
            self.errorpl.setText(f'Ошибка MySQL: {e}')   
            self.errorpl.move(10, 300)
            self.errorpl.setWordWrap(True) 
            self.errorpl.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
            self.errorpl.show()   
         

    def closeEvent(self, event):
        if self.window:
            self.window.close() 
            sys.exit(app.exec())  
            
        event.accept()  

class App(QMainWindow):  
    def __init__(self):  
        super().__init__()
        self.initUI() 
        self.dlg = Dlg(self) 
        self.dlg.exec()  

    def initUI(self):    
        self.setWindowTitle('MySQL Checker - Русский')  
        self.setWindowIcon(QIcon('./files/Icon.ico'))  
        self.showMaximized()   
        self.tab_widget = MyTabWidget(self)   
        self.setCentralWidget(self.tab_widget)  


    def closeEvent(self, event):  
        if self.dlg.isVisible():
            self.dlg.close()  
        event.accept()  

if __name__ == '__main__':   
    app = QApplication(sys.argv)  
    app.setWindowIcon(QIcon('./files/Icon.ico')) 
    ex = App()    
    sys.exit(app.exec())  

И модуля tmp:

    import tempfile

log_tmp = None
def new():
    global log_tmp
    log_tmp = tempfile.TemporaryFile(mode='w+t')

def write(login, password):
    global log_tmp
    log_tmp.writelines([login, '\n', password, '\n'])
    log_tmp.seek(0)

def read():
    global log_tmp
    log = log_tmp.read().split()
    log_tmp.seek(0)
    return log

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