Как закрыть окно при нажатии кнопки и обновить таблицу в главном окне в PyQt?

#qt #pyqt #pyqt5

#qt #pyqt #pyqt5

Вопрос:

У меня в главном окне есть таблица, в которой данные поступают из базы данных MySQL.

В этой таблице есть кнопка для добавления нового элемента. Когда вы нажимаете на кнопку, открывается новое окно, содержащее форму. Как только вы заполнили форму и нажмете кнопку «Добавить раздел» во втором окне, предполагается выполнить эти три действия,

  1. Вставьте данные обратно в базу данных (это работает)
  2. Закройте второе окно (не работает)
  3. Обновите таблицу в Главном окне новой записью.

Теперь это основная функция, которая заключается в получении записи из базы данных и отображении ее в таблице на главном окне,

 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. Спасибо 🙁 это была такая ошибка новичка. Спасибо, что исправили это.