Gemessene Werte in Datenbanktabelle speichern

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
pythonstudyy
User
Beiträge: 4
Registriert: Samstag 28. August 2021, 09:34

Hallo Zusammen

Habe folgende Fehlermeldung, die ich einfach nicht weggrkiege. Evtl kann jemand von euch mir helfen. Ich bin leider kein Hirsch in der Python umgebung.
Es geht um ein Projekt, wo ich über eine externe Hardware mit einem Raspberrypi Werte über die GUI auslese und einen Plot erzeuge.
Die ausgelesenen Werte möchte ich nun in der Datenbank mit einem Save Knopf in der GUI Speichern aber leider kommt immer dieser Fehler:

Traceback (most recent call last):
File "C:/ABBTS/Semester 5/B21-ga5.1_Engineering with Software (ENS)/GUI_Qt/plc_NEU/plc/Main.py", line 177, in <module>
window = UI()
File "C:/ABBTS/Semester 5/B21-ga5.1_Engineering with Software (ENS)/GUI_Qt/plc_NEU/plc/Main.py", line 47, in __init__
self.save_database.clicked.connect(self.save_database(self.Name_measurement.text(),self.IP_Address_history.currentText(),self.Ports_history.currentText(),self.CSV_txt_file_names,self.matplotlib_png_file_name,"N/A",self.labels))
AttributeError: 'UI' object has no attribute 'CSV_txt_file_names'

Process finished with exit code 1

Wenn mir jemand helfen kann wäre das echt super !!!

HIER DER GESAMTE CODE:

Code: Alles auswählen

import csv # zum Arbeiten mit CSV Dateien
from itertools import count  # Verwendung bei map() um aufeinanderfolgende Datenpunkte zu generieren. = Schnellere ausfühurngszeit
from opcua import Client #Import von OPC UA für Kommunikation mit Codesys
import matplotlib.pyplot as plt # Für die Ploterzeugung
import sqlite3 # Datenbank

conn = sqlite3.connect('Database_.db') # Connect mit der Datenbank
from csv import DictWriter # Um den IP Verlauf in die CSV Datei zu schreiben
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton,QComboBox,QLineEdit,QMessageBox,QFileDialog # Für die GUI Anwendungen
from PyQt5 import uic #Für die UI
import sys #Für den zugriff auf Systemspezifische Parameter
 

class UI(QMainWindow):
    def __init__(self):
        super(UI, self).__init__()

        uic.loadUi("ui.ui", self)

        self.ip=[]
        self.ports=[]
        self.headersCSV = ['IP','PORT']
        self.setWindowTitle('EWS Klausur')


        ############# ComboBox ##################################################
        self.IP_Address_history = self.findChild(QComboBox, "Ip_address_history")
        self.Ports_history = self.findChild(QComboBox, "ports_history")

        ############# Line_Edit #################################################
        self.add_ip= self.findChild(QLineEdit, "add_ip")
        self.add_ports= self.findChild(QLineEdit, "add_port")
        self.Name_measurement= self.findChild(QLineEdit, "Name_measurement")

        ############# Buttons ###################################################
        self.connect = self.findChild(QPushButton,"connect")
        self.add = self.findChild(QPushButton,"add")
        self.read = self.findChild(QPushButton,"read")
        self.save = self.findChild(QPushButton,"save")
        self.save_database = self.findChild(QPushButton,"save_database")

        ############# Buttons - clicked #######################################
        self.connect.clicked.connect(self.Connection)
        self.add.clicked.connect(self.add_ip_port)
        self.read.clicked.connect(self.main)
        self.save.clicked.connect(self.save_file)
        self.save_database.clicked.connect(self.save_database(self.Name_measurement.text(),self.IP_Address_history.currentText(),self.Ports_history.currentText(),self.CSV_txt_file_names,self.matplotlib_png_file_name,"N/A",self.labels))

        self.show()
        
    def save_database(self,Name_measurement,IP_address,port_number,CSV_txt_file_names,matplotlib_png_file_name,times,labels):
        data = [(Name_measurement,IP_address,port_number,CSV_txt_file_names,matplotlib_png_file_name,times,labels)]
        
        conn.executemany("INSERT INTO Measurement (Name_measurement,IP_address,port_number,CSV_txt_file_names,matplotlib_png_file_name,times,labels) \
            VALUES (?,?,?,?,?,?,?)",data);
        conn.commit()
        conn.close()

    def Connection(self):
        ############# Data_History_saving########################################
        if self.IP_Address_history.currentText() == "" or self.Ports_history.currentText() == "":
            self.msg_box= QMessageBox() 
            self.msg_box.setIcon(QMessageBox.Warning)
            self.msg_box.setText("Insert values in the required fileds")
            self.msg_box.setWindowTitle("Warning")
            self.msg_box.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            retval = self.msg_box.exec_()
            print("insert values in the required fileds")
        else:
            self.main()
    def add_ip_port(self):
        if self.add_ip.text() == "" or self.add_ports.text() == "":
            self.msg_box= QMessageBox() 
            self.msg_box.setIcon(QMessageBox.Warning)
            self.msg_box.setText("Insert values in the required fileds")
            self.msg_box.setWindowTitle("Warning")
            self.msg_box.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            retval = self.msg_box.exec_()
        else:
            self.ip.append(self.add_ip.text())
            self.ports.append(self.add_ports.text())
            with open ('Data.csv','a', newline='') as data:
                writer = DictWriter(data, fieldnames=self.headersCSV)
                ip = self.add_ip.text().strip()
                port = self.add_ports.text().strip()
                temp ={'IP':ip,'PORT':port}
                print(temp)
                writer.writerow(temp)
                self.IP_Address_history.addItems(self.ip)
                self.Ports_history.addItems(self.ports)
                data.close()

    
    def get_opc_child(self,root, channel):
        return root.get_child([
            "0:Objects",
            "2:DeviceSet",
            "4:CODESYS Control for Raspberry Pi SL",
            "3:Resources",
            "4:app",
            "3:Programs",
            "4:MAIN",
            f"4:OpcUA_U_{channel}"])

    def read_channels(self,client):
        try:
            client.connect()
            root = client.get_root_node()
            self.change_status_of_connection_btn(1)
            return [self.get_opc_child(root,channel).get_value() for channel in ["in1", "in2", "out1", "out2", "out3"] ]

        except:
            client.disconnect()
            self.change_status_of_connection_btn(0)
    def write_values(self,values):
        self.CSV_txt_file_names = "C:\ABBTS\Semester 5\B21-ga5.1_Engineering with Software (ENS)\GUI_Qt\plc_NEU\plc/BORIS.txt"
        with open(self.CSV_txt_file_names, "w", encoding="utf8") as file:
            times = (0.005 * t for t in count())
            writer = csv.writer(file, delimiter="\t", lineterminator="\r")
            for row in zip(times, *values):
                writer.writerow(map("{:.3f}".format, row))

    def plot_values(self,values):
        self.labels = "In1"+"In2"+"Out1"+"Out2"+"Out3"
        plt.axis([0.0, 5.0, -4.0, 8.0])
        times = [0.005 * t for t in range(len(values[0]))]
        for numbers, label, color in zip(values,
            ["In1", "In2", "Out1", "Out2", "Out3"],
            ["green", "purple", "cyan", "orange", "red"]):
            self.MplWidget.canvas.axes.clear()
            plt.plot(times, numbers, label=label, color=color, linestyle="-", linewidth=2.5)
            self.MplWidget.canvas.axes.plot(times, numbers, label=label, color=color, linestyle="-", linewidth=2.5)
            self.MplWidget.canvas.draw()

        plt.title('SPS_Signals', fontsize=26, color='blue')
        plt.legend(loc='best')
        plt.grid(False)
        self.matplotlib_png_file_name = 'C:\ABBTS\Semester 5\B21-ga5.1_Engineering with Software (ENS)\GUI_Qt\plc_NEU\plc/SPS_Signal.png'
        plt.savefig(self.matplotlib_png_file_name)
        plt.show()
    
    def main(self):
        client = Client("opc.tcp://"+self.IP_Address_history.currentText()+":"+self.Ports_history.currentText())
        values = self.read_channels(client)
        self.write_values(values)
        self.plot_values(values)
    def save_file(self):
        filepath, _ = QFileDialog.getSaveFileName(self,"Save file","","DOCX(*.DOCX) ;;JPEG(*.jpg *.jpeg) ;; ALL Files(*.*)")
        if filepath == "":
            return
        
    
        from docx import Document
        from docx.shared import Inches
        document = Document()
        document.add_heading('SPS_Logger_OPC-UA', 0)
        document.add_heading('Meine Messungen', level=0)
        document.add_picture('C:\ABBTS\Semester 5\B21-ga5.1_Engineering with Software (ENS)\GUI_Qt\plc_NEU\plc\SPS_Signal.png', width=Inches(5))
        document.add_heading('In1 ist das Signal von OpcUA_U_in1 und kommt von WaveformsSquare', level=2)
        document.add_heading('In2 ist das Signal von OpcUA_U_in2 und kommt von WaveformsTriangle', level=2)
        document.add_heading('Out1 ist das Signal OpcUA_U_out1 = In1 - In2', level=2)
        document.add_heading('Out2 ist das Signal OpcUA_U_out2 = In1 + In2', level=2)
        document.add_heading('Out3 ist das Signal OpcUA_U_out3 = 0.527', level=2)
        document.add_page_break(), document.save('test.docx')    
    def change_status_of_connection_btn(self,stat):
        # 1 == connected
        # 0 == not connected
        if stat == 1:
            self.connect.setStyleSheet("background-color:rgb(0, 255, 0);")
        if stat == 0:
            self.connect.setStyleSheet("background-color:rgb(255, 0, 0);")


 
 
app = QApplication(sys.argv)
window = UI()
app.exec_()
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Die Fehlermeldung ist ja recht eindeutig. Das Attribug "CSV_txt_file_names" gibt es nicht.
Generell gilt: Alle Attribute werden in der __init__ angelegt - und nicht irgendwie magisch in irgendwelchen Methoden (write_values). Denn dann passiert genau das, was hier passiert: Es kann der Vorgang eintreten, dass du denkst, es ist da - ist es aber gar nicht.

In deinem Fall wird also das Attribut in write_values angelegt. Das musst du also vorher aufrufen.
Aber wie gesagt: Attribute erscheinen nicht magisch in einem Objekt.
Antworten