Problem beim Aufruf eines Konstruktors / von Methoden mit dem Schlüsselwort "self"

pkm

Bekanntes Mitglied
Ich habe in Python einen Datenbankzugriff, mit dem ich Termine aus einer DB hole - die Termine bekomme ich dann in ein dictionary, das wie folgt aussieht: dict = {'2020-11-11 11:11': 'Bla'} Hier die DB-Zugriffsklasse:

[CODE lang="python" title="dbaccess.py"]import psycopg2

def doQuery(conn):
appntments = {}
cur = conn.cursor()
cur.execute("SELECT datum, termin FROM appointment")
for date, appointment in cur.fetchall():
appntments[date] = appointment

return appntments

def allAppointments():
hostname = "localhost"
username = "postgres"
password = "root"
database = "dtls"

myConnection = psycopg2.connect( host=hostname, user=username, password=password, dbname=database )
res = doQuery(myConnection)

return res
[/CODE]

Hier ist meine Hauptklasse mit dem Mainwindow:

Python:
import sys
import datetime
from PyQt5.QtWidgets import (QWidget, QGridLayout,QPushButton, QApplication, QScrollArea, QMainWindow, QToolBar, QMenu, QLabel, QCalendarWidget)
from PyQt5.QtCore import Qt, QSize
from PyQt5 import QtWidgets, uic, QtCore, QtGui
 
from core import dbaccess

class MainWindow(QMainWindow):
    
    singleton: 'MainWindow' = None
    
    def __init__(self, filterwert):
        super().__init__()

        tb = QToolBar(self)
        cal = QCalendarWidget(self)
        cal.setGridVisible(True)
        tb.addWidget(cal)       
        tb.setAllowedAreas(Qt.TopToolBarArea)
        tb.setFloatable(False)
        tb.setMovable(False)
        self.addToolBar(tb)

        dict = dbaccess.allAppointments()

        grid_layout = QGridLayout()
        self.widget = QWidget()
        self.widget.setLayout(grid_layout)
        self.scroll = QScrollArea() 

        button = QPushButton(' Kalenderwoche--------------------- Datum des Termins mit Wochentag - Termin (zum Bearbeiten klicken)')
        button.setStyleSheet("text-align: left;font-weight: bold; font-size: 14px; color:black")
        button.setEnabled(False)
        
        grid_layout.setAlignment(Qt.AlignTop)
        
        grid_layout.addWidget(button, 0, 0, 1, 3)
        
        create = QPushButton("create")
        create.resize(10, 10)
        grid_layout.addWidget(create, 0, 3, 1, 3)
        
        dict = dbaccess.allAppointments()
        
        keys = []
        
        for k in dict.keys():
            keys.append(k)
        
        values = []
        
        for v in dict.values():
            values.append(v)
        
        i=0
        
        for x in range(1, len(dict)+1):
            
            for y in range(0, 4):
                button = QPushButton(values[i])
                date = QPushButton(keys[i])
                date.setEnabled(False)
                delete = QPushButton("del")
                delete.resize(10, 10)
                delete.setObjectName('Button%d' % x)
                delete.released.connect(self.button_released)
                
                if y == 0:
                    grid_layout.addWidget(date, x, y)
                if y == 1:
                    dt = date.text().split(" ")[0].split("-")
                    intDay = datetime.date(year=int(dt[0]), month=int(dt[1]), day=int(dt[2])).weekday()
                    days = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"]
                    date.setText(date.text() + ", " +  days[intDay])
                    
                    #self.testMethode("cd")
                    
                    grid_layout.addWidget(date, x, y)
                if y == 2:
                    grid_layout.addWidget(button, x, y)
                if y == 3:
                    grid_layout.addWidget(delete, x, y)
            
            i+=1
                
        self.scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self.scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.scroll.setWidgetResizable(True)
        self.scroll.setWidget(self.widget)
        self.setCentralWidget(self.scroll)
        self.setWindowTitle("CRM")
        self.setAttribute(Qt.WA_StyledBackground, True)
        self.setStyleSheet('background-color: lightgreen;')
        self.setGeometry(90, 90, 855, 600)
        self.show()

        return

    def button_released(self):
        sending_button = self.sender()
        print(sending_button.objectName())
        ##TODO: Hier dann erst das, was wir nicht mehr brauchen aus der DB löschen!
        filterwert = ('', '', '')
        self.restart(filterwert)
          
        
    @staticmethod
    def restart(self, filterwert):
        MainWindow.singleton = MainWindow(filterwert)


    #def testMethode(self, cd):
    #    print("test")

def main():
    app = QtWidgets.QApplication(sys.argv)
    filterwert = ('', '', '')
    MainWindow.restart(filterwert)
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

Mein Plan ist folgender. Wenn ich einen del-Button drücke, dann möchte ich einen Termin (den Termin, der sich auf der Zeile mit dem del-Button befindet) löschen. Diese Logik werde ich dann noch implementieren, ebenso werde ich anhand eines Kalenderwidgets eine Monats, Jahres und Tagesansicht mir ausgeben lassen, aber auch das kommt noch - nun mein Problem:

Den Code der Hauptklasse kann ich so nicht ausführen, es kommt immer die Fehlermeldung:

Traceback (most recent call last):
File "C:\Users\XXX\Documents\workspace\pycrm\core\__init__.py", line 124, in <module>
main()
File "C:\Users\XXX\Documents\workspace\pycrm\core\__init__.py", line 119, in main
MainWindow.restart(filterwert)
TypeError: restart() missing 1 required positional argument: 'filterwert'

Irgendwie bekomme ich da bei der Methode button_released, main und restart etwas mit dem "self" nicht hin. Ich kriege es aber nicht hin - woran könnte das liegen :\ ?
 

pkm

Bekanntes Mitglied
... ich habe es nun gelöst:

[CODE lang="python" title="Hauptdatei"]import sys
import datetime
from PyQt5.QtWidgets import (QWidget, QGridLayout,QPushButton, QApplication, QScrollArea, QMainWindow, QToolBar, QMenu, QLabel, QCalendarWidget, QComboBox, QMessageBox)
from PyQt5.QtCore import Qt, QSize
from PyQt5 import QtWidgets, uic, QtCore, QtGui
from functools import partial
from core import dbaccess

class MainWindow(QMainWindow):

singleton: 'MainWindow' = None

def __init__(self, filtervals):
super().__init__()

tb = QToolBar(self)
cal = QCalendarWidget(self) #https://www.tutorialspoint.com/pyqt/pyqt_qcalender_widget.htm
cal.setGridVisible(True)

cb = QComboBox()
cb.addItem("Monatsansicht")
cb.addItem("Tagesansicht")
cb.addItem("Jahresansicht")

cal.clicked[QtCore.QDate].connect(partial(self.cal_clicked_filter, cal, cb)) #.connect(self.cal_clicked_filter)

tb.addWidget(cal)
tb.addWidget(cb)
tb.setAllowedAreas(Qt.TopToolBarArea)
tb.setFloatable(False)
tb.setMovable(False)
self.addToolBar(tb)

dict = dbaccess.allAppointments()

grid_layout = QGridLayout()
self.widget = QWidget()
self.widget.setLayout(grid_layout)
self.scroll = QScrollArea()

button = QPushButton(" Kalenderwoche--------------------- Datum des Termins mit Wochentag - Termin (zum Bearbeiten klicken)")
button.setStyleSheet("text-align: left;font-weight: bold; font-size: 14px; color:black")
button.setEnabled(False)

grid_layout.setAlignment(Qt.AlignTop)

grid_layout.addWidget(button, 0, 0, 1, 3)

create = QPushButton("create")
create.resize(10, 10)
create.clicked.connect(self.showdialog)

grid_layout.addWidget(create, 0, 3, 1, 3)

filteredDict = {}

dict = dbaccess.allAppointments()

if filtervals[0] == "" and filtervals[1] == "" and filtervals[2] == "":
filteredDict = dict

else:
filteredDict = self.filter(dict, filtervals)

keys = []

for k in filteredDict.keys():
keys.append(k)

values = []

for v in filteredDict.values():
values.append(v)

i=0

for x in range(1, len(filteredDict)+1):

for y in range(0, 4):
button = QPushButton(values)
date = QPushButton(keys)
date.setStyleSheet("color:black")
date.setEnabled(False)
delete = QPushButton("del")
delete.resize(10, 10)
delete.setObjectName('Button%d' % x)
delete.released.connect(partial(self.button_released, filteredDict))

if y == 0:
grid_layout.addWidget(date, x, y)
if y == 1:
dt = date.text().split(" ")[0].split("-")
intDay = datetime.date(year=int(dt[0]), month=int(dt[1]), day=int(dt[2])).weekday()
days = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"]
date.setText(date.text() + ", " + days[intDay])

#self.testMethode("cd")

grid_layout.addWidget(date, x, y)
if y == 2:
grid_layout.addWidget(button, x, y)
if y == 3:
grid_layout.addWidget(delete, x, y)

i+=1

self.scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.scroll.setWidgetResizable(True)
self.scroll.setWidget(self.widget)
self.setCentralWidget(self.scroll)
self.setWindowTitle("CRM")
self.setAttribute(Qt.WA_StyledBackground, True)
self.setStyleSheet('background-color: lightgreen;')
self.setGeometry(90, 90, 855, 600)
self.show()

return

def showdialog(self):
msg = QMessageBox()
msg.setIcon(QMessageBox.Information)
msg.setText("This is a message box")
msg.setInformativeText("This is additional information")
msg.setWindowTitle("MessageBox demo")
msg.setDetailedText("The details are as follows:")
msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
msg.buttonClicked.connect(self.msgbtn)
retval = msg.exec_()
print("value of pressed message box button:", retval)

def msgbtn(self, i):
print("Button pressed is:",i.text())

def filter(self, dict, filtervals):
returndict = {}
#Tag:
if filtervals[0] != "" and filtervals[1] != "" and filtervals[2] != "":
for key in dict:
if(key.split(" ")[0] == filtervals[0] + "-" + filtervals[1] + "-" + filtervals[2]):
returndict[key]=dict[key]

#Monat:
if filtervals[0] == "" and filtervals[1] != "" and filtervals[2] == "":
for key in dict:
if(key.split(" ")[0].split("-")[1] == filtervals[1]):
returndict[key]=dict[key]

#Jahr
if filtervals[0] != "" and filtervals[1] == "" and filtervals[2] == "":
for key in dict:
if(key.split(" ")[0].split("-")[0] == filtervals[0]):
returndict[key]=dict[key]

return returndict

def button_released(self, filteredDict):
sending_button = self.sender()

index = sending_button.objectName()[6:]

i = 1
for k in filteredDict:
if int(i) == int(index):
dbaccess.deleteAppointment(k)
i+=1

self.close()
self.restart(["", "", ""])

def cal_clicked_filter(self, cal, cb):
filtervals = ['', '', '']
date = str(cal.selectedDate())
lt = date.rindex('(')
gt = date.rindex(')')
ansicht = cb.currentText()
if ansicht == "Tagesansicht":
filtervals[0] = date[lt+1:gt].split(', ')[0]
filtervals[1] = self.formatDayMonth(date[lt+1:gt].split(', ')[1])
filtervals[2] = self.formatDayMonth(date[lt+1:gt].split(', ')[2])

if ansicht == "Monatsansicht":
filtervals[1] = self.formatDayMonth(date[lt+1:gt].split(', ')[1])

if ansicht == "Jahresansicht":
filtervals[0] = date[lt+1:gt].split(', ')[0]


self.close()
self.restart(filtervals)

def formatDayMonth(self, val):

result = val

if len(val) < 2:
result = val.rjust(1 + len(val), '0')

return result


@staticmethod
def restart(filtervals):
MainWindow.singleton = MainWindow(filtervals)


#def testMethode(self, cd):
# print("test")

def main():
app = QtWidgets.QApplication(sys.argv)
MainWindow.restart(["", "", ""])
sys.exit(app.exec_())


if __name__ == '__main__':
main()


[/CODE]


Python:
import psycopg2

def doQuery(conn):
appntments = {}
cur = conn.cursor()
cur.execute("SELECT datum, termin FROM appointment")
for date, appointment in cur.fetchall():
appntments[date] = appointment

return appntments


def doQueryDel(conn, datum):
cur = conn.cursor()
cur.execute("DELETE FROM appointment WHERE datum = %s", (datum,))
conn.commit()
cur.close()

def deleteAppointment(datum):
hostname = "localhost"
username = "postgres"
password = "XXX"
database = "dtls"

myConnection = psycopg2.connect( host=hostname, user=username, password=password, dbname=database )
doQueryDel(myConnection, datum)

def allAppointments():
hostname = "localhost"
username = "postgres"
password = "XXX"
database = "dtls"

myConnection = psycopg2.connect( host=hostname, user=username, password=password, dbname=database )
res = doQuery(myConnection)

return res
 

Ähnliche Java Themen

Neue Themen


Oben