Seite 1 von 1

QApplication zweites Fenster SQLITE

Verfasst: Dienstag 3. August 2021, 18:09
von Karambit
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!

Re: QApplication zweites Fenster SQLITE

Verfasst: Freitag 6. August 2021, 09:36
von Welpe
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

Re: QApplication zweites Fenster SQLITE

Verfasst: Freitag 6. August 2021, 09:43
von __deets__
Bitte den vollstaendigen Stacktrace zeigen.

Re: QApplication zweites Fenster SQLITE

Verfasst: Freitag 6. August 2021, 19:54
von Welpe
__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_())

Re: QApplication zweites Fenster SQLITE

Verfasst: Freitag 6. August 2021, 20:32
von __deets__
Ja, ich meinte dich. Und Stacktrace ist die Fehlermeldung. Bitte auch in Code Tags.