#qt #pyqt #pyqt5
#qt #pyqt #pyqt5
Вопрос:
У меня в главном окне есть таблица, в которой данные поступают из базы данных MySQL.
В этой таблице есть кнопка для добавления нового элемента. Когда вы нажимаете на кнопку, открывается новое окно, содержащее форму. Как только вы заполнили форму и нажмете кнопку «Добавить раздел» во втором окне, предполагается выполнить эти три действия,
- Вставьте данные обратно в базу данных (это работает)
- Закройте второе окно (не работает)
- Обновите таблицу в Главном окне новой записью.
Теперь это основная функция, которая заключается в получении записи из базы данных и отображении ее в таблице на главном окне,
def get_section_data(self): mycursor = self.DB.cursor() Subquery = "Select * from tbl_section" mycursor.execute(Subquery) numcols = len(mycursor.fetchall()[0]) mycursor.execute(Subquery) numrows = len(mycursor.fetchall()) self.ui.section_table.setRowCount(numrows) self.ui.section_table.setColumnCount(numcols) mycursor.execute(Subquery) tablerow = 0 for row in mycursor.fetchall(): tablecol = 0 while tablecol lt; numcols: self.ui.section_table.setItem(tablerow, tablecol, PySide2.QtWidgets.QTableWidgetItem(str(row[tablecol]))) tablecol = 1 tablerow = 1
это функция, которая вызывается, когда вы нажимаете «Добавить раздел» в главном окне (это открывает Новую форму).
def executeAddSectionPage(self): self.window = QtWidgets.QMainWindow() self.add_section_form = Ui_Add_Section_Window() self.add_section_form.setupUi(self.window) self.window.show() self.add_section_form.section_add_form_button.clicked.connect(self.insert_section_info)
Ниже приведена функция, которая вызывается при нажатии на «Добавить раздел» во 2-й форме,
def insert_section_info(self): id = self.add_section_form.section_id_add.text() name = self.add_section_form.section_name_add.text() mycursor = self.DB.cursor() sql = "Insert into tbl_section (section_id, section_name) VALUES (%s, %s)" val = (int(id), name) mycursor.execute(sql, val) self.DB.commit() # self.add_section_form.hide() -gt; I tried to add this but it didn't work
Когда я нажимаю на кнопку «Добавить раздел» во втором окне, она ничего не делает (кроме сохранения записи в базе данных на бэкэнде). Когда я снова нажимаю на него, он разбивает оба окна.
Как я могу выполнять необходимые функции?
Ниже приведен полный код моего main.py
## IMPORTS import sys import os import PySide2 import mysql.connector as mc from qt_material import * from PyQt5 import QtWidgets, uic from add_section_page import Ui_Add_Section_Window ##################################### # Import GUI File from ui_interface import * ###################################### # class Add_Section(QMainWindow): # def __init__(self): # super(Add_Section, self).__init__() # self.uic.loadUi('add_section_page.ui', self) ## Main Window Class class MainWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.ui = Ui_MainWindow() self.ui.setupUi(self) try: self.DB = mc.connect(host="localhost", user="root", password="", database="timetable_manager") except mc.Error as e: print("Error") # Load Style Sheet apply_stylesheet(app, theme="dark_cyan.xml") # Remove Window Title Bar self.setWindowFlags(PySide2.QtCore.Qt.FramelessWindowHint) # Set main background to transparent self.setAttribute(PySide2.QtCore.Qt.WA_TranslucentBackground) # Shadow Style Effect self.shadow = QGraphicsDropShadowEffect(self) self.shadow.setBlurRadius(50) self.shadow.setXOffset(0) self.shadow.setYOffset(0) self.shadow.setColor(QColor(0, 92, 157, 550)) # Apply shadow to central widget self.ui.centralwidget.setGraphicsEffect(self.shadow) self.setWindowIcon(PySide2.QtGui.QIcon(":/icons/airplay.svg")) # Set Window Title self.setWindowTitle("Timetable Manager") # Window Size grip to resize window QSizeGrip(self.ui.size_grip) # Minimize Window self.ui.minimize_window_button.clicked.connect(lambda: self.showMinimized()) # Close Window self.ui.close_window_button.clicked.connect(lambda: self.close()) # Maximize Window self.ui.restore_window_button.clicked.connect(lambda: self.restore_or_maximize_window()) # Navigate to Section Page self.ui.section_menu_button.clicked.connect(lambda: self.ui.stackedWidget.setCurrentWidget(self.ui.section_page)) self.ui.course_menu_button.clicked.connect(lambda: self.ui.stackedWidget.setCurrentWidget(self.ui.course_page)) self.ui.add_section_button.clicked.connect(self.executeAddSectionPage) self.show() self.get_section_data() def executeAddSectionPage(self): self.window = QtWidgets.QMainWindow() self.add_section_form = Ui_Add_Section_Window() self.add_section_form.setupUi(self.window) self.window.show() self.add_section_form.section_add_form_button.clicked.connect(self.insert_section_info) def insert_section_info(self): id = self.add_section_form.section_id_add.text() name = self.add_section_form.section_name_add.text() mycursor = self.DB.cursor() sql = "Insert into tbl_section (section_id, section_name) VALUES (%s, %s)" val = (int(id), name) mycursor.execute(sql, val) self.DB.commit() # self.add_section_form.hide() -gt; I tried to add this but it didn't work def get_section_data(self): mycursor = self.DB.cursor() Subquery = "Select * from tbl_section" mycursor.execute(Subquery) numcols = len(mycursor.fetchall()[0]) mycursor.execute(Subquery) numrows = len(mycursor.fetchall()) self.ui.section_table.setRowCount(numrows) self.ui.section_table.setColumnCount(numcols) mycursor.execute(Subquery) tablerow = 0 for row in mycursor.fetchall(): tablecol = 0 while tablecol lt; numcols: self.ui.section_table.setItem(tablerow, tablecol, PySide2.QtWidgets.QTableWidgetItem(str(row[tablecol]))) tablecol = 1 tablerow = 1 def restore_or_maximize_window(self): if self.isMaximized(): self.showNormal() #self.ui.restore_window_button.setIcon() else: self.showMaximized() #self.ui.restore_window_button.setIcon() #def get_section_data(self): # sqlquery = "SELECT * FROM tbl_section" # cur = self.db.cursor() # for row in cur.execute(sqlquery): # print(row) ## EXECUTE APP if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec_())
Комментарии:
1. Я попытался добавить файлы пользовательского интерфейса для обоих окон, но, к сожалению, не смог добавить их из-за ограничения количества символов в сообщении
2. Опечатка:
self.add_section_form
это класс формы (базовый объект python, используемый для настройки пользовательского интерфейса), а не виджет. Изменить наself.window.close()
3. Спасибо 🙁 это была такая ошибка новичка. Спасибо, что исправили это.