- ВКонтакте
- РћРТвЂВВВВВВВВнокласснРСвЂВВВВВВВВРєРСвЂВВВВВВВВ
- РњРѕР№ Р В Р’В Р РЋРЎв„ўР В Р’В Р РЋРІР‚ВВВВВВВВРЎР‚
- Viber
- Skype
- Telegram
Обновить 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