QApplication zweites Fenster SQLITE

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Karambit
User
Beiträge: 7
Registriert: Mittwoch 26. August 2020, 15:37

Hallo,

kann mir jemand vielleicht bei dem Umgang mit QApplication helfen?

Ich schreib ein kleines Programm zur Arbeitszeitenerfassung.

Das Hauptprogramm

Code: Alles auswählen

import sqlite3
import sys
from sqlite3.dbapi2 import Cursor
from PyQt5 import QtGui
from MainWindow import MainWindow
from PyQt5 import QtCore, QtWidgets, uic

def main(): 
    
    app = QtWidgets.QApplication(sys.argv)
   # app.exec_
    hauptfenster = MainWindow()
    hauptfenster.show()
    sys.exit(app.exec())


if __name__ == "__main__":
    main()
 
Das Hauptfenster wird erzeugt, in dem die Arbeitszeiten auf der DB bearbeitet werden:

Code: Alles auswählen

from Workingday import Workingday
from Project import Project
import sys
import os
import sqlite3
from PyQt5 import QtCore, QtGui, QtWidgets, uic

class MainWindow(QtWidgets.QMainWindow):

    bufferrecord1 = ' '
    bufferrecord2 = ' '
    bufferdate = ' '
    

    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)  # Alternative: super()
        self.ui = uic.loadUi("designArbeitszeitenerfassung.ui", self)
        self.ui.pushButtonLadeDaten.clicked.connect(self.pushButtonLadeDatenclick)
        self.ui.pushButtonZeitenbuchen.clicked.connect(self.pushButtonZeitenbuchenclick)
        self.ui.pushButtonZeitenbuchen.setShortcut("Ctrl+b")
        self.ui.pushButtonLadeDaten.setShortcut("Ctrl+l")
        self.ui.pushButtonLoeschen.setShortcut("Ctrl+d")
        self.ui.pushButtonLoeschen.clicked.connect(self.pushButtonLoeschenclick)
        self.ui.action_Projekte_anlegen.triggered.connect(self.action_Projekte_anlegenclick)
      #  self.ui.action_Projekte_anlegen.triggered.connect.setShortcut("Ctrl+m")                  
        self.ui.dateEdit.setDateTime(QtCore.QDateTime.currentDateTime())

    def getWindowProjectsCustomizing(self):
        self.ui = uic.loadUi("designProjectsCustomizing.ui", self)
        self.ui.pushButtonMenu.clicked.connect(self.pushButtonMenuclick)
        self.ui.pushButtonAdd.clicked.connect(self.pushButtonAddcklick)
        #self.ui.pushButtonDelete.clicked.connect(self.pushButtonDeleteclick)
        # datarecord = Workingday.load_data_projects(self)
        print("Go")
        
    def pushButtonAddcklick(self):
        msgBox = QtWidgets.QMessageBox()
        project_name = self.textEditProjectName.toPlainText()
        notes_project_txt =  self.textEditProjectNotes.toPlainText()
        if not self.textEditProjectNotes.toPlainText():
            msgBox.setText("Der Name des Projektes darf nicht leer sein.")
            msgBox.setStandardButtons(QtWidgets.QMessageBox.Ok)
            msgBox.setDefaultButton(QtWidgets.QMessageBox.Ok)
            ret = msgBox.exec_()
        elif not self.textEditProjectNotes.toPlainText():
            msgBox.setText("Es muss eine Beschreibung zum Projekt eingetragen sein.")
            msgBox.setStandardButtons(QtWidgets.QMessageBox.Ok)
            msgBox.setDefaultButton(QtWidgets.QMessageBox.Ok)
            ret = msgBox.exec_()
        else:
            verbindung = sqlite3.connect("arbeitszeiten.db")
            cursor = verbindung.cursor()  
      #  self.cursor.execute()
            try: 
                sqlite_insert_with_param = """INSERT OR REPLACE INTO projekte (name, beschreibung)
                                          VALUES(?, ?)"""            
                cursor.execute(sqlite_insert_with_param, [project_name, notes_project_txt])
                        
            except sqlite3.IntegrityError:
            
                print("Zu dem Datum gibt es schon einen Eintrag")
                a = True
                while a == True:
                    x = input('Soll der Datensatz überschrieben werden? (j/n)')
                if x == 'j':
                    a = False
                    #
                elif x == 'n': a = False

            verbindung.commit()

        #     self.pushButtonLadeDatenclick()

    def pushButtonZeitenbuchenclick(self):
        msgBox = QtWidgets.QMessageBox()
        temp_var = self.dateEdit.date()
        date = temp_var.toPyDate() 
        date = str(date)
        self.date = date
        project_txt = self.textEditProject.toPlainText()
        notes_txt =  self.textEditNotes.toPlainText()
        hours = self.doubleSpinBoxHours.value()
        if not self.textEditProject.toPlainText():
            
           # msgBox.setIcon()
            msgBox.setText("Das Feld 'Projekt' darf nicht leer sein.")
            msgBox.setStandardButtons(QtWidgets.QMessageBox.Ok)
            msgBox.setDefaultButton(QtWidgets.QMessageBox.Ok)
            ret = msgBox.exec_()
        elif self.doubleSpinBoxHours.value() <= 0:
            msgBox.setText("Die Angabe der Studenanzahl ist ungültig.")
            msgBox.setStandardButtons(QtWidgets.QMessageBox.Ok)
            msgBox.setDefaultButton(QtWidgets.QMessageBox.Ok)
            ret = msgBox.exec_()
        else:
            tag = Workingday(date, project_txt, notes_txt, hours)
            tag.add_Arbeitszeiten()
            tag.close_db_connection()
            self.pushButtonLadeDatenclick()

    def pushButtonLadeDatenclick(self):
        temp_var = self.dateEdit.date()
        date = temp_var.toPyDate() 
        date = str(date)
        self.date = date
        datarecord1, datarecord2 = Workingday.load_data(self)
        print(datarecord1)
        print(datarecord2)
        self.set_buffer(datarecord1, datarecord2, date)
        self.get_buffer()
        
    def pushButtonLoeschenclick(self):
        msgBox = QtWidgets.QMessageBox()
        anzahlZeilen = self.tableWidgetProjects.rowCount()
        i = 0
        # print("Zeilen: " + str(anzahlZeilen))
        # while i < anzahlZeilen:
        #     print('i: ' + str(i)) 
        i_projektname = self.tableWidgetProjects.item(self.ui.tableWidgetProjects.currentRow(),0).text()
        i_date = Workingday.get_Datum(self)
        msgBox.setText("Soll die ausgewählte Zeile gelöscht werden?")
        msgBox.setStandardButtons(QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel)
        ret = msgBox.exec_()
        if ret == QtWidgets.QMessageBox.Ok:
            Workingday.delete_data(self,i_date,i_projektname)
            self.pushButtonLadeDatenclick()
        i+=1            

    def pushButtonMenuclick(self):
        self.ui = uic.loadUi("designArbeitszeitenerfassung.ui", self)
        self.ui.pushButtonLadeDaten.clicked.connect(self.pushButtonLadeDatenclick)
        self.ui.pushButtonZeitenbuchen.clicked.connect(self.pushButtonZeitenbuchenclick)
        self.ui.pushButtonZeitenbuchen.setShortcut("Ctrl+b")
        self.ui.pushButtonLadeDaten.setShortcut("Ctrl+l")
        self.ui.pushButtonLoeschen.setShortcut("Ctrl+d")
        self.ui.pushButtonLoeschen.clicked.connect(self.pushButtonLoeschenclick)
        self.ui.action_Projekte_anlegen.triggered.connect(self.action_Projekte_anlegenclick)
      #  self.ui.action_Projekte_anlegen.triggered.connect.setShortcut("Ctrl+m")                  
        self.ui.dateEdit.setDateTime(QtCore.QDateTime.currentDateTime())
        self.get_buffer()

    def action_Projekte_anlegenclick(self):
        self.getWindowProjectsCustomizing()


    def _removeRow(self):
        if self.rowCount() > 0:
            currentRow = self.currentRow()
            self._removeRow(currentRow)
    
    def set_buffer(self, record1, record2, date):
        self.bufferrecord1 = record1
        self.bufferrecord2 = record2
        self.bufferdate = date

    def get_buffer(self):
        datarecord1 = self.bufferrecord1
        datarecord2 = self.bufferrecord2
        print(self.bufferdate)
        strdat = str(self.bufferdate)
        new_date = QtCore.QDate.fromString(strdat,"yyyy-MM-dd")
        print("New:" + str(new_date))
        print(type(new_date))
        self.ui.dateEdit.setDate(new_date)
        self.dateEdit.setDate(new_date)
        self.dateEdit.setDate(QtCore.QDate.fromString(self.bufferdate, "dd-MM-yyyy"))
        self.ui.dateEdit.setDate(QtCore.QDate.fromString(self.bufferdate, "dd-MM-yyyy"))
        self.tableWidgetWorkingDay.setRowCount(1)
        self.tableWidgetProjects.setRowCount(len(datarecord1))
        self.tableWidgetWorkingDay.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
        self.tableWidgetProjects.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
        tablerow = 0
        if not datarecord2:
            self.tableWidgetWorkingDay.setRowCount(0)
            self.pushButtonLoeschen.setEnabled(False) 
        else:
            if datarecord2 !=' ':
                for row in datarecord2:
                    it2 = str(row[1])
                    self.tableWidgetWorkingDay.setItem(tablerow, 0, QtWidgets.QTableWidgetItem(row[0]))
                    self.tableWidgetWorkingDay.setItem(tablerow, 1, QtWidgets.QTableWidgetItem(it2))
                tablerow+=1
            self.pushButtonLoeschen.setEnabled(True)    

        tablerow = 0
        if not datarecord1:
            self.tableWidgetProjects.setRowCount(0)
        else:   
            if datarecord1 != ' ':
                for row in datarecord1:
                    it3 = str(row[3])
                    self.tableWidgetProjects.setItem(tablerow, 0, QtWidgets.QTableWidgetItem(row[1]))
                    self.tableWidgetProjects.setItem(tablerow, 1, QtWidgets.QTableWidgetItem(row[2]))
                    self.tableWidgetProjects.setItem(tablerow, 2, QtWidgets.QTableWidgetItem(it3))
                    tablerow+=1
Die Methode ruft ein anderes UI auf, sodass das Hauptfenster dieses wird und hier soll auch eine Bearbeitung in einer Tabelle der gleichen Datenbank erfolgen.

def getWindowProjectsCustomizing(self):
self.ui = uic.loadUi("designProjectsCustomizing.ui", self)
self.ui.pushButtonMenu.clicked.connect(self.pushButtonMenuclick)
self.ui.pushButtonAdd.clicked.connect(self.pushButtonAddcklick)
#self.ui.pushButtonDelete.clicked.connect(self.pushButtonDeleteclick)
# datarecord = Workingday.load_data_projects(self)


In Workingday gibt es die Methode load_data, die dann einen INSERT machen soll, aber beim cursor.execute kriege ich dann die Meldung: "QCoreApplication::exec: The event loop is already running".

def add_data_projects(self, i_project_name, i_notes_project_txt):
project_name = i_project_name
project_notes = i_notes_project_txt
verbindung = sqlite3.connect("arbeitszeiten.db")
cursor = verbindung.cursor()
# self.cursor.execute()
try:
sqlite_insert_with_param = """INSERT OR REPLACE INTO projekte (name, beschreibung)
VALUES(?, ?)"""
cursor.execute(sqlite_insert_with_param, project_name, project_notes)

except sqlite3.IntegrityError:


Hier wäre meine Frage, wo dieser dann noch einmal erzeugt wird.
Ich würde mich sehr über jegliche Hilfe freuen :-)

Vielen Dank schon einmal!
Welpe
User
Beiträge: 26
Registriert: Mittwoch 30. Dezember 2020, 10:39

Moin,
schau dir mal diese Videoreihe an. Den Code dazu gibts in der Videobeschreibung. Dort werden mehrere Fenster mit QT erzeugt und mit QtWidgets.QStackedWidget() gestapelt. Vielleicht hilft Dir das weiter.

https://youtube.com/playlist?list=PLs3 ... wUaoj44rCV
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte den vollstaendigen Stacktrace zeigen.
Welpe
User
Beiträge: 26
Registriert: Mittwoch 30. Dezember 2020, 10:39

__deets__ hat geschrieben: Freitag 6. August 2021, 09:43 Bitte den vollstaendigen Stacktrace zeigen.
Meinst Du mich damit? Wenn ja, was ist ein Stacktrace?

Hier ein kurzes Beispiel mit dem Fensterwechsel.

Code: Alles auswählen

import sys
from PyQt5.uic import loadUi
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QDialog, QApplication

class ErstesFenster(QDialog):
    def __init__(self):
        super(ErstesFenster, self).__init__()
        loadUi('fenster_eins.ui', self)
        self.btn_zweites_fenster.clicked.connect(self.gehe_zum_zweiten_fenster)

    def gehe_zum_zweiten_fenster(self):
        fenster = ZweitesFenster()
        widget.addWidget(fenster)
        widget.setCurrentIndex(widget.currentIndex()+1)

class ZweitesFenster(QDialog):
    def __init__(self):
        super(ZweitesFenster, self).__init__()
        loadUi('fenster_zwei.ui', self)


app = QApplication(sys.argv)
willkommen = ErstesFenster()
widget = QtWidgets.QStackedWidget()
widget.addWidget(willkommen)
widget.setFixedHeight(400)
widget.setFixedWidth(400)
widget.show()

sys.exit(app.exec_())
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, ich meinte dich. Und Stacktrace ist die Fehlermeldung. Bitte auch in Code Tags.
Antworten