Hallo,
ich versuche mal alles aus dem Forum so gut umzusetzen wie ich es verstanden habe.
Zunächst zu den Modulen/ Skripten, vielleicht verstehe ich da was falsch. Soweit ich in meinen Python Buch gelesen habe, sind Module (auch) Skripte die beim Einbinden einmal gestartet werden, oder ist das falsch?
z.B.:
Jedes Mal, wenn ein Python-Skript ausgeführt wird, wird ein Bytecode erstellt. Wenn ein Python-Skript als Modul importiert wird, wird der Bytecode in der entsprechenden .pyc-Datei gespeichert
__blackjack__ hat hier geschrieben:
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Jetzt bin ich mir da unsicher ob es zulässig ist, dass man in einem "Modul" auch einen Multithread startet, indem die Funktion aufgerufen wird. Weil man könnte das auch so interpretieren, dass die Threads nur im Hauptskript geöffnet werden sollen und die Funktionen und Klassen in den Modulen? Ich binde die .py Module jedenfalls als Modul ein bzw importiere from modul_xyz import xyz.
Bzgl der globalen Variable. Das könnte ich so ändern, dass ich die Variable über eine Return Funktion aus dem Modul zurückgebe, dann kann ich diese lokal machen.
Ad 1: Aktualisieren des Plotter Fensters
Hier ist einmal mein Code aus dem Modul "plotter.py".
Code: Alles auswählen
import pyqtgraph as pg
from PyQt6.QtWidgets import QMainWindow
import numpy as np
uiclass, baseclass = pg.Qt.loadUiType("plotter_window.ui")
class PlotterWindow(QMainWindow, uiclass):
def __init__(self, df):
super().__init__()
self.setupUi(self)
def plot(self, df):
print("Daten des DF in Plotter Modul")
print(df)
spo2_list = df['Red'].astype(float) # Gibt alle Werte aus, funktioniert
# spo2_list = df['Red'][:100].astype(float) #gibt die ersten 100 Werte aus, funktioniert
# spo2_list = df['Red'].tail(100).astype(float) #soll die letzten 100 Werte ausgeben, funktioniert nicht
print("spo2_list = ")
print(spo2_list)
print("letzte 100 Werte")
letzte_werte = df['Red'].tail(100).astype(float)
print(letzte_werte) #Gibt die letzten 100 Werte an der Konsole aus, funktioniert
spo2_list = spo2_list[np.isfinite(spo2_list)] # Filtert ungültige Werte
self.graphWidget.plot(spo2_list)
def update_button_plotter(self):"
print("Daten des DF in Plotter Modul")
Das starte ich nun in meinem Hauptprogramm über eine Funktion, wenn ein Button geklickt wird:
Code: Alles auswählen
plotter_window = PlotterWindow(df)
# Überprüfen, ob das Plotter-Fenster bereits erstellt wurde
if plotter_window is None:
# Erstellen einer Instanz des Plotter-Fensters und übergeben von df
plotter_window = PlotterWindow(df)
plotter_window_ui = plotter_window.ui # Referenz auf die UI des Plotter-Fensters
uic.loadUi("plotter_window.ui", self)
plotter_window.plot(df) # Aufruf der plot-Funktion, um den Graphen anzuzeigen
plotter_window.show() # Annzeigen des Plotter Fensters
Das Fenster wird mir korrekt geöffnet und die Daten von df übergeben, wobei ich nun immer das Plotter Fenster neu öffnen muss, ich möchte es aber über den Menüpunkt Datei >> Aktualisieren aktualisieren. Wie bereits gesagt hat mein Plotter Fenster eine .ui im qt Designer erhalten, hier wurde ein Widget hochgestuft. Ich muss jetzt also den Aktualisieren Menüpunkt mit dem aktualisieren des Plotters verknüpfen. Fehler habe ich hier nie erhalten, aber einfach keine Reaktion. Ich hätte zuerst einmal versucht eine einfache Funktion mit print "Aktualisieren Butten gedrückt" zu verbinden, aber irgendwie klappt das nicht. Bei meinem anderen Fenster hatte ich dieses Problem nicht. Ich kann den Code dann nochmal reinschreiben. (Hab den Code gestern gelöscht um es nochmal neu zu versuchen)
Ad 2 Error beim Umstellen der Plotter Daten
Wenn ich alle Daten des df plotten will, oder die ersten, dann klappt es, nur wenn ich die letzten plotten will bekomme ich:
Code: Alles auswählen
Start Button wurde gedrückt
30-05-2023_11-26-59.xlsx
30-05-2023_11-26-59.xlsx
Datei angelegt
Red IR
0 1014 4900
1 1013 4900
2 1012 4897
3 1021 4895
4 1019 4888
.. ... ...
295 1021 4887
296 1020 4886
297 1011 4882
298 1024 4885
299 1029 4890
[300 rows x 2 columns]
Daten des DF in Plotter Modul
Red IR
0 1014 4900
1 1013 4900
2 1012 4897
3 1021 4895
4 1019 4888
.. ... ...
295 1021 4887
296 1020 4886
297 1011 4882
298 1024 4885
299 1029 4890
[300 rows x 2 columns]
spo2_list =
200 1023.0
201 1020.0
202 1019.0
203 1018.0
204 1015.0
...
295 1021.0
296 1020.0
297 1011.0
298 1024.0
299 1029.0
Name: Red, Length: 100, dtype: float64
letzte 100 Werte
200 1023.0
201 1020.0
202 1019.0
203 1018.0
204 1015.0
...
295 1021.0
296 1020.0
297 1011.0
298 1024.0
299 1029.0
Name: Red, Length: 100, dtype: float64
Traceback (most recent call last):
File "C:\Users\emanu\miniconda34\lib\site-packages\pandas\core\indexes\base.py", line 3652, in get_loc
return self._engine.get_loc(casted_key)
File "pandas\_libs\index.pyx", line 147, in pandas._libs.index.IndexEngine.get_loc
File "pandas\_libs\index.pyx", line 176, in pandas._libs.index.IndexEngine.get_loc
File "pandas\_libs\hashtable_class_helper.pxi", line 2606, in pandas._libs.hashtable.Int64HashTable.get_item
File "pandas\_libs\hashtable_class_helper.pxi", line 2630, in pandas._libs.hashtable.Int64HashTable.get_item
KeyError: 0
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\emanu\source\repos\PythonApplication3\PythonApplication3\PythonApplication3.py", line 369, in Plotter_clicked
plotter_window.plot(df) # Aufruf der plot-Funktion, um den Graphen anzuzeigen
File "C:\Users\emanu\source\repos\PythonApplication3\PythonApplication3\plotter.py", line 27, in plot
self.graphWidget.plot(spo2_list)
File "C:\Users\emanu\miniconda34\lib\site-packages\pyqtgraph\graphicsItems\PlotItem\PlotItem.py", line 630, in plot
item = PlotDataItem(*args, **kargs)
File "C:\Users\emanu\miniconda34\lib\site-packages\pyqtgraph\graphicsItems\PlotDataItem.py", line 366, in __init__
self.setData(*args, **kargs)
File "C:\Users\emanu\miniconda34\lib\site-packages\pyqtgraph\graphicsItems\PlotDataItem.py", line 697, in setData
dt = dataType(data)
File "C:\Users\emanu\miniconda34\lib\site-packages\pyqtgraph\graphicsItems\PlotDataItem.py", line 1207, in dataType
first = obj[0]
File "C:\Users\emanu\miniconda34\lib\site-packages\pandas\core\series.py", line 1007, in __getitem__
return self._get_value(key)
File "C:\Users\emanu\miniconda34\lib\site-packages\pandas\core\series.py", line 1116, in _get_value
loc = self.index.get_loc(label)
File "C:\Users\emanu\miniconda34\lib\site-packages\pandas\core\indexes\base.py", line 3654, in get_loc
raise KeyError(key) from err
KeyError: 0
Wenn ich das auf alle Daten oder nur die ersten umändere (im Beispiel oben plotte ich alle, siehe Kommentare) klappt es.
Ich hoffe ich habe nun alles nachvollziehbar beschrieben, sonst kann ich auch kurz ein Video machen und auf YT hochladen um die GUI zu erklären.
MFG