Compare commits
No commits in common. "519b248261336dbf48533bc9e7c684e49d74ba61" and "83fe9b3350a992df284f9af4ad307c6ccc7f7ee3" have entirely different histories.
519b248261
...
83fe9b3350
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,5 +1,5 @@
|
|||||||
# Output Files
|
# Output Files
|
||||||
version.txt
|
bersion.txt
|
||||||
*.csv
|
*.csv
|
||||||
*.out
|
*.out
|
||||||
.idea/
|
.idea/
|
||||||
|
@ -2,7 +2,7 @@ import os
|
|||||||
|
|
||||||
|
|
||||||
class Measurement:
|
class Measurement:
|
||||||
def __init__(self, name, path=None, comment=None):
|
def __init__(self, name, sensors, path=None, comment=None):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.path = os.path.join(path or "./meas_values", self.name)
|
self.path = os.path.join(path or "./meas_values", self.name)
|
||||||
os.makedirs(self.path)
|
os.makedirs(self.path)
|
||||||
@ -18,8 +18,8 @@ class Measurement:
|
|||||||
data: list of tuples: (timestamp, value)
|
data: list of tuples: (timestamp, value)
|
||||||
"""
|
"""
|
||||||
if sensor_name not in self.data_files:
|
if sensor_name not in self.data_files:
|
||||||
self.data_files[sensor_name] = open(os.path.join(self.path, f"{sensor_name}_data.csv"), "w")
|
self.data_files[sensor_name] = open(os.path.join(self.path, f"{sensor_name}_data.csv"))
|
||||||
for timestamp, value in zip(data[0], data[1]):
|
for timestamp, value in data:
|
||||||
self.data_files[sensor_name].write(f"{timestamp.isoformat()}, {timestamp.timestamp()}, {value}\n")
|
self.data_files[sensor_name].write(f"{timestamp.isoformat()}, {timestamp.timestamp()}, {value}\n")
|
||||||
|
|
||||||
def save_version_text(self, comment):
|
def save_version_text(self, comment):
|
||||||
|
46
model.py
46
model.py
@ -5,58 +5,34 @@ Data:
|
|||||||
- dict with sensor data (temp, pressure, current)
|
- dict with sensor data (temp, pressure, current)
|
||||||
- dict with drivers (magnetic field control)
|
- dict with drivers (magnetic field control)
|
||||||
"""
|
"""
|
||||||
from datetime import datetime
|
|
||||||
from threading import Event, Thread
|
|
||||||
from time import sleep
|
|
||||||
from sensor import Sensor
|
from sensor import Sensor
|
||||||
from measurement import Measurement
|
|
||||||
from plot_data import PlotData
|
|
||||||
|
|
||||||
class DataGrabber(Thread):
|
|
||||||
def __init__(self, sensors, drivers, plot_data):
|
|
||||||
super().__init__()
|
|
||||||
self.measurement = None
|
|
||||||
self.sensors = sensors
|
|
||||||
self.drivers = drivers
|
|
||||||
self.plot_data = plot_data
|
|
||||||
self.exit_request = Event()
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
while not self.exit_request.is_set():
|
|
||||||
for name, sens in self.sensors.items():
|
|
||||||
dat = sens.get_data
|
|
||||||
self.plot_data.append_data(name,dat)
|
|
||||||
if self.measurement is not None:
|
|
||||||
self.measurement.append_data(name, dat)
|
|
||||||
sleep(1)
|
|
||||||
|
|
||||||
|
|
||||||
class Model:
|
class Model:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.plot_data = PlotData()
|
|
||||||
self.sensors = {"temp": Sensor(), "keks": Sensor()}
|
self.sensors = {"temp": Sensor(), "keks": Sensor()}
|
||||||
self.drivers = []
|
self.drivers = []
|
||||||
self.measurement = None
|
self.measurement = None
|
||||||
self.data_grabber = DataGrabber(self.sensors, self.drivers, self.plot_data)
|
self.plot_data = None
|
||||||
self.data_grabber.start()
|
pass
|
||||||
|
|
||||||
def start_measuring(self, meas_name=""):
|
def start_measuring(self):
|
||||||
name = meas_name or f"meas_{datetime.utcnow().isoformat().replace(':', '-')}"
|
for sens in self.sensors.values():
|
||||||
self.measurement = Measurement(name)
|
sens.start_measuring()
|
||||||
self.data_grabber.measurement = self.measurement
|
|
||||||
|
|
||||||
def save_measuring(self, path="temp_temp.csv"):
|
def save_measuring(self, path="temp_temp.csv"):
|
||||||
print("Has no use delete me maybe")
|
for sens in self.sensors.values():
|
||||||
|
sens.save_measuring()
|
||||||
|
|
||||||
def stop_measuring(self):
|
def stop_measuring(self):
|
||||||
self.measurement = None
|
for sens in self.sensors.values():
|
||||||
self.data_grabber.measurement = None
|
sens.stop_measuring()
|
||||||
|
|
||||||
def clear(self):
|
def clear(self):
|
||||||
self.plot_data.clear()
|
for sens in self.sensors.values():
|
||||||
|
sens.clear()
|
||||||
|
|
||||||
def exit(self):
|
def exit(self):
|
||||||
self.data_grabber.exit_request.set()
|
|
||||||
for sens in self.sensors.values():
|
for sens in self.sensors.values():
|
||||||
sens.exit()
|
sens.exit()
|
||||||
|
|
||||||
|
49
plot_data.py
49
plot_data.py
@ -1,21 +1,15 @@
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
class PlotData():
|
class PlotData():
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.refresh_rate = 1 # ms
|
self.refresh_rate = 1 # ms
|
||||||
self.timeout = 100 # cycles
|
self.timeout = 100 # cycles
|
||||||
self.data = {"time": np.array([0])}
|
self.data = {"time": np.array([0])}
|
||||||
self.start_time = datetime.utcnow()
|
self.start_time = datetime.utcnow()
|
||||||
self.queues = {}
|
self.queues = {}
|
||||||
|
|
||||||
def clear(self):
|
|
||||||
for key in self.data:
|
|
||||||
self.data[key] = np.array([])
|
|
||||||
|
|
||||||
def get(self, key):
|
|
||||||
return self.data.get(key, np.full_like(self.data["time"], np.nan, dtype=np.double))
|
|
||||||
|
|
||||||
def append_data(self, sensor_name, data):
|
def append_data(self, sensor_name, data):
|
||||||
"""
|
"""
|
||||||
@ -23,37 +17,25 @@ class PlotData():
|
|||||||
"""
|
"""
|
||||||
if sensor_name not in self.data:
|
if sensor_name not in self.data:
|
||||||
self.queues[sensor_name] = []
|
self.queues[sensor_name] = []
|
||||||
self.data[sensor_name] = np.full_like(self.data["time"], np.nan, dtype=np.double)
|
self.data[sensor_name] = np.full_like(self.data["time"], np.nan)
|
||||||
for time, dat in zip(data[0], data[1]):
|
|
||||||
self.queues[sensor_name].append((time, dat))
|
for data_tuple in data.values():
|
||||||
|
self.queues[sensor_name].append(data_tuple)
|
||||||
|
|
||||||
running = True
|
running = True
|
||||||
while running:
|
while running:
|
||||||
# TODO timeout clean and time clean
|
#TODO timeout clean
|
||||||
for sensor, que in self.queues.items():
|
|
||||||
index = -1
|
|
||||||
for time, _ in que:
|
|
||||||
if time < self.start_time \
|
|
||||||
+ timedelta(milliseconds=int(self.data["time"][-1]) + self.refresh_rate):
|
|
||||||
index += 1
|
|
||||||
if index >= 0:
|
|
||||||
self.queues[sensor] = que[index:]
|
|
||||||
#TODO timeout not working as intended
|
|
||||||
#if timeout is reached add empty values on sensors
|
|
||||||
#if self.start_time + timedelta(milliseconds=int(self.data["time"][-1])+self.timeout) < datetime.utcnow():
|
|
||||||
# for sensor, que in self.queues.items():
|
|
||||||
# if len(que) == 0:
|
|
||||||
# que.append((self.start_time,np.nan))
|
|
||||||
|
|
||||||
for que in self.queues.values():
|
for que in self.queues.values():
|
||||||
if len(que) == 0:
|
if len(que) == 0:
|
||||||
running = False
|
running = False
|
||||||
return
|
break
|
||||||
|
|
||||||
|
for sensor,que in self.queues.items():
|
||||||
|
self.data[sensor] = np.append(self.data[sensor], que[0])
|
||||||
|
que = que[1:]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for sensor, que in self.queues.items():
|
|
||||||
self.data[sensor] = np.append(self.data[sensor], que[0][1])
|
|
||||||
self.queues[sensor] = que[1:]
|
|
||||||
self.data["time"] = np.append(self.data["time"],self.data["time"][-1]+self.refresh_rate)
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
TODO
|
TODO
|
||||||
@ -64,3 +46,4 @@ class PlotData():
|
|||||||
return
|
return
|
||||||
update np array
|
update np array
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
40
sensor.py
40
sensor.py
@ -14,16 +14,18 @@ class SensorWorker(Thread):
|
|||||||
self.message_queue = message_queue
|
self.message_queue = message_queue
|
||||||
self.produceData = Event()
|
self.produceData = Event()
|
||||||
self.exit_request = Event()
|
self.exit_request = Event()
|
||||||
|
self.file = open("temp.csv", "w")
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
""" Worker method of a python Thread. Called when the Thread is started. """
|
""" Worker method of a python Thread. Called when the Thread is started. """
|
||||||
while not self.exit_request.is_set():
|
while not self.exit_request.is_set():
|
||||||
if self.produceData.is_set():
|
if self.produceData.is_set():
|
||||||
temp = random()
|
temp = random()
|
||||||
ts = datetime.utcnow()
|
ts = datetime.now()
|
||||||
self.message_queue.put((ts, temp))
|
self.message_queue.put((ts, temp))
|
||||||
|
self.file.write(f"{ts} - {temp}\n")
|
||||||
else:
|
else:
|
||||||
pass
|
self.file.flush()
|
||||||
sleep(1)
|
sleep(1)
|
||||||
|
|
||||||
|
|
||||||
@ -32,44 +34,38 @@ class Sensor(object):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(Sensor, self).__init__()
|
super(Sensor, self).__init__()
|
||||||
|
self.data = []
|
||||||
|
self.t = []
|
||||||
self.measureQueue = Queue()
|
self.measureQueue = Queue()
|
||||||
self.measureThread = SensorWorker(self.measureQueue)
|
self.measureThread = SensorWorker(self.measureQueue)
|
||||||
self.measureThread.start()
|
self.measureThread.start()
|
||||||
self.measureThread.produceData.set()
|
|
||||||
|
|
||||||
|
|
||||||
def start_measuring(self):
|
def start_measuring(self):
|
||||||
self.measureThread.produceData.set()
|
self.measureThread.produceData.set()
|
||||||
print("I started meas")
|
print("I started meas")
|
||||||
|
|
||||||
|
def save_measuring(self, path="temp_temp.csv"):
|
||||||
|
print("I saved meas")
|
||||||
|
np.savetxt(path, np.array(self.data))
|
||||||
|
|
||||||
def stop_measuring(self):
|
def stop_measuring(self):
|
||||||
self.measureThread.produceData.clear()
|
self.measureThread.produceData.clear()
|
||||||
print("I stopped meas")
|
print("I stopped meas")
|
||||||
|
|
||||||
|
def clear(self):
|
||||||
|
self.data = []
|
||||||
|
self.t = []
|
||||||
|
print("I cleared meas")
|
||||||
|
|
||||||
def exit(self):
|
def exit(self):
|
||||||
self.stop_measuring()
|
self.stop_measuring()
|
||||||
self.measureThread.exit_request.set()
|
self.measureThread.exit_request.set()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def get_data(self):
|
def get_data(self):
|
||||||
time = []
|
|
||||||
val = []
|
|
||||||
while not self.measureQueue.empty():
|
while not self.measureQueue.empty():
|
||||||
t, data = self.measureQueue.get()
|
t, data = self.measureQueue.get()
|
||||||
time.append(t)
|
self.data.append(data)
|
||||||
val.append(data)
|
self.t.append(t)
|
||||||
return time, val
|
print(self.data)
|
||||||
|
return self.t, self.data
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# def clear(self):
|
|
||||||
# self.data = []
|
|
||||||
# self.t = []
|
|
||||||
# print("I cleared meas")
|
|
||||||
#
|
|
||||||
# def save_measuring(self, path="temp_temp.csv"):
|
|
||||||
# print("I saved meas")
|
|
||||||
# np.savetxt(path, np.array(self.data))
|
|
||||||
|
|
||||||
|
@ -1,190 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<!-- generated by wxGlade 1.0.2 on Sun Jul 4 21:22:59 2021 -->
|
|
||||||
|
|
||||||
<application class="MyApp" encoding="UTF-8" for_version="3.0" header_extension=".h" indent_amount="4" indent_symbol="space" is_template="0" language="python" mark_blocks="1" name="app" option="0" overwrite="1" path="./wxglade_out.py" source_extension=".cpp" top_window="frame" use_gettext="0" use_new_namespace="1">
|
|
||||||
<object class="MyFrame" name="frame" base="EditFrame">
|
|
||||||
<size>1920, 1080</size>
|
|
||||||
<title>frame</title>
|
|
||||||
<style>wxDEFAULT_FRAME_STYLE</style>
|
|
||||||
<menubar>1</menubar>
|
|
||||||
<toolbar>1</toolbar>
|
|
||||||
<statusbar>1</statusbar>
|
|
||||||
<object class="wxMenuBar" name="frame_menubar" base="EditMenuBar">
|
|
||||||
<menus>
|
|
||||||
<menu label="File" name="">
|
|
||||||
<item>
|
|
||||||
<label>Quit</label>
|
|
||||||
</item>
|
|
||||||
</menu>
|
|
||||||
</menus>
|
|
||||||
</object>
|
|
||||||
<object class="wxStatusBar" name="frame_statusbar" base="EditStatusBar">
|
|
||||||
<fields>
|
|
||||||
<field width="-1">frame_statusbar</field>
|
|
||||||
</fields>
|
|
||||||
</object>
|
|
||||||
<object class="wxToolBar" name="frame_toolbar" base="EditToolBar">
|
|
||||||
<tools>
|
|
||||||
</tools>
|
|
||||||
</object>
|
|
||||||
<object class="wxPanel" name="panel_1" base="EditPanel">
|
|
||||||
<object class="wxGridBagSizer" name="grid_sizer_1" base="EditGridBagSizer">
|
|
||||||
<rows>2</rows>
|
|
||||||
<cols>3</cols>
|
|
||||||
<vgap>0</vgap>
|
|
||||||
<hgap>0</hgap>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<span>2, 1</span>
|
|
||||||
<border>0</border>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
<object class="wxBoxSizer" name="sizer_1" base="EditBoxSizer">
|
|
||||||
<orient>wxVERTICAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<option>0</option>
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxStaticText" name="label_1" base="EditStaticText">
|
|
||||||
<label>Text1</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<option>0</option>
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxStaticText" name="label_2" base="EditStaticText">
|
|
||||||
<label>Für</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<option>0</option>
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxStaticText" name="label_3" base="EditStaticText">
|
|
||||||
<label>Statis</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
<object class="wxNotebook" name="notebook_1" base="EditNotebook">
|
|
||||||
<style>wxNB_TOP</style>
|
|
||||||
<tabs>
|
|
||||||
<tab window="notebook_1_pane_1">notebook_1_pane_1</tab>
|
|
||||||
<tab window="notebook_1_pane_2">notebook_1_pane_2</tab>
|
|
||||||
<tab window="notebook_1_pane_3">notebook_1_pane_3</tab>
|
|
||||||
<tab window="notebook_1_pane_4">notebook_1_pane_4</tab>
|
|
||||||
</tabs>
|
|
||||||
<object class="wxPanel" name="notebook_1_pane_1" base="EditPanel">
|
|
||||||
<style>wxTAB_TRAVERSAL</style>
|
|
||||||
</object>
|
|
||||||
<object class="wxPanel" name="notebook_1_pane_2" base="EditPanel">
|
|
||||||
<style>wxTAB_TRAVERSAL</style>
|
|
||||||
</object>
|
|
||||||
<object class="wxPanel" name="notebook_1_pane_3" base="EditPanel">
|
|
||||||
<style>wxTAB_TRAVERSAL</style>
|
|
||||||
</object>
|
|
||||||
<object class="wxPanel" name="notebook_1_pane_4" base="EditPanel">
|
|
||||||
<style>wxTAB_TRAVERSAL</style>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<span>2, 1</span>
|
|
||||||
<border>0</border>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
<object class="wxGridBagSizer" name="grid_sizer_3" base="EditGridBagSizer">
|
|
||||||
<rows>2</rows>
|
|
||||||
<cols>1</cols>
|
|
||||||
<vgap>10</vgap>
|
|
||||||
<hgap>0</hgap>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
<object class="wxGridBagSizer" name="grid_sizer_4" base="EditGridBagSizer">
|
|
||||||
<rows>3</rows>
|
|
||||||
<cols>1</cols>
|
|
||||||
<vgap>0</vgap>
|
|
||||||
<hgap>0</hgap>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_1" base="EditButton">
|
|
||||||
<label>button_1</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_2" base="EditButton">
|
|
||||||
<label>button_2</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_3" base="EditButton">
|
|
||||||
<label>button_3</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
<object class="wxGridBagSizer" name="grid_sizer_5" base="EditGridBagSizer">
|
|
||||||
<rows>3</rows>
|
|
||||||
<cols>1</cols>
|
|
||||||
<vgap>0</vgap>
|
|
||||||
<hgap>0</hgap>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_7" base="EditButton">
|
|
||||||
<label>button_7</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_8" base="EditButton">
|
|
||||||
<label>button_8</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_9" base="EditButton">
|
|
||||||
<label>button_9</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizerslot" />
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
<object class="wxGridBagSizer" name="grid_sizer_2" base="EditGridBagSizer">
|
|
||||||
<rows>1</rows>
|
|
||||||
<cols>3</cols>
|
|
||||||
<vgap>0</vgap>
|
|
||||||
<hgap>0</hgap>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_4" base="EditButton">
|
|
||||||
<label>button_4</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_5" base="EditButton">
|
|
||||||
<label>button_5</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_6" base="EditButton">
|
|
||||||
<label>button_6</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizerslot" />
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</application>
|
|
@ -1,174 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<!-- generated by wxGlade 1.0.2 on Sun Jul 4 21:21:09 2021 -->
|
|
||||||
|
|
||||||
<application class="MyApp" encoding="UTF-8" for_version="3.0" header_extension=".h" indent_amount="4" indent_symbol="space" is_template="0" language="python" mark_blocks="1" name="app" option="0" overwrite="1" path="./wxglade_out.py" source_extension=".cpp" top_window="frame" use_gettext="0" use_new_namespace="1">
|
|
||||||
<object class="MyFrame" name="frame" base="EditFrame">
|
|
||||||
<size>474, 290</size>
|
|
||||||
<title>frame</title>
|
|
||||||
<style>wxDEFAULT_FRAME_STYLE</style>
|
|
||||||
<menubar>1</menubar>
|
|
||||||
<object class="wxMenuBar" name="frame_menubar" base="EditMenuBar">
|
|
||||||
<menus>
|
|
||||||
</menus>
|
|
||||||
</object>
|
|
||||||
<object class="wxPanel" name="panel_1" base="EditPanel">
|
|
||||||
<object class="wxGridBagSizer" name="grid_sizer_1" base="EditGridBagSizer">
|
|
||||||
<rows>2</rows>
|
|
||||||
<cols>3</cols>
|
|
||||||
<vgap>0</vgap>
|
|
||||||
<hgap>0</hgap>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<span>2, 1</span>
|
|
||||||
<border>0</border>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
<object class="wxBoxSizer" name="sizer_1" base="EditBoxSizer">
|
|
||||||
<orient>wxVERTICAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<option>0</option>
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxStaticText" name="label_1" base="EditStaticText">
|
|
||||||
<label>Text1</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<option>0</option>
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxStaticText" name="label_2" base="EditStaticText">
|
|
||||||
<label>Für</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<option>0</option>
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxStaticText" name="label_3" base="EditStaticText">
|
|
||||||
<label>Statis</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
<object class="wxNotebook" name="notebook_1" base="EditNotebook">
|
|
||||||
<style>wxNB_TOP</style>
|
|
||||||
<tabs>
|
|
||||||
<tab window="notebook_1_pane_1">notebook_1_pane_1</tab>
|
|
||||||
<tab window="notebook_1_pane_2">notebook_1_pane_2</tab>
|
|
||||||
<tab window="notebook_1_pane_3">notebook_1_pane_3</tab>
|
|
||||||
<tab window="notebook_1_pane_4">notebook_1_pane_4</tab>
|
|
||||||
</tabs>
|
|
||||||
<object class="wxPanel" name="notebook_1_pane_1" base="EditPanel">
|
|
||||||
<style>wxTAB_TRAVERSAL</style>
|
|
||||||
</object>
|
|
||||||
<object class="wxPanel" name="notebook_1_pane_2" base="EditPanel">
|
|
||||||
<style>wxTAB_TRAVERSAL</style>
|
|
||||||
</object>
|
|
||||||
<object class="wxPanel" name="notebook_1_pane_3" base="EditPanel">
|
|
||||||
<style>wxTAB_TRAVERSAL</style>
|
|
||||||
</object>
|
|
||||||
<object class="wxPanel" name="notebook_1_pane_4" base="EditPanel">
|
|
||||||
<style>wxTAB_TRAVERSAL</style>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<span>2, 1</span>
|
|
||||||
<border>0</border>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
<object class="wxGridBagSizer" name="grid_sizer_3" base="EditGridBagSizer">
|
|
||||||
<rows>2</rows>
|
|
||||||
<cols>1</cols>
|
|
||||||
<vgap>10</vgap>
|
|
||||||
<hgap>0</hgap>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
<object class="wxGridBagSizer" name="grid_sizer_4" base="EditGridBagSizer">
|
|
||||||
<rows>3</rows>
|
|
||||||
<cols>1</cols>
|
|
||||||
<vgap>0</vgap>
|
|
||||||
<hgap>0</hgap>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_1" base="EditButton">
|
|
||||||
<label>button_1</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_2" base="EditButton">
|
|
||||||
<label>button_2</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_3" base="EditButton">
|
|
||||||
<label>button_3</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
<object class="wxGridBagSizer" name="grid_sizer_5" base="EditGridBagSizer">
|
|
||||||
<rows>3</rows>
|
|
||||||
<cols>1</cols>
|
|
||||||
<vgap>0</vgap>
|
|
||||||
<hgap>0</hgap>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_7" base="EditButton">
|
|
||||||
<label>button_7</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_8" base="EditButton">
|
|
||||||
<label>button_8</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_9" base="EditButton">
|
|
||||||
<label>button_9</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizerslot" />
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
<object class="wxGridBagSizer" name="grid_sizer_2" base="EditGridBagSizer">
|
|
||||||
<rows>1</rows>
|
|
||||||
<cols>3</cols>
|
|
||||||
<vgap>0</vgap>
|
|
||||||
<hgap>0</hgap>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_4" base="EditButton">
|
|
||||||
<label>button_4</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_5" base="EditButton">
|
|
||||||
<label>button_5</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<border>0</border>
|
|
||||||
<object class="wxButton" name="button_6" base="EditButton">
|
|
||||||
<label>button_6</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="sizerslot" />
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</application>
|
|
@ -1,138 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
# -*- coding: UTF-8 -*-
|
|
||||||
#
|
|
||||||
# generated by wxGlade 1.0.2 on Sun Jul 4 21:29:50 2021
|
|
||||||
#
|
|
||||||
|
|
||||||
import wx
|
|
||||||
|
|
||||||
# begin wxGlade: dependencies
|
|
||||||
# end wxGlade
|
|
||||||
|
|
||||||
# begin wxGlade: extracode
|
|
||||||
# end wxGlade
|
|
||||||
|
|
||||||
|
|
||||||
class MyFrame(wx.Frame):
|
|
||||||
def __init__(self, *args, **kwds):
|
|
||||||
# begin wxGlade: MyFrame.__init__
|
|
||||||
kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
|
|
||||||
wx.Frame.__init__(self, *args, **kwds)
|
|
||||||
self.SetSize((1920, 1080))
|
|
||||||
self.SetTitle("frame")
|
|
||||||
|
|
||||||
# Menu Bar
|
|
||||||
self.frame_menubar = wx.MenuBar()
|
|
||||||
wxglade_tmp_menu = wx.Menu()
|
|
||||||
wxglade_tmp_menu.Append(wx.ID_ANY, "Quit", "")
|
|
||||||
self.frame_menubar.Append(wxglade_tmp_menu, "File")
|
|
||||||
self.SetMenuBar(self.frame_menubar)
|
|
||||||
# Menu Bar end
|
|
||||||
|
|
||||||
self.frame_statusbar = self.CreateStatusBar(1)
|
|
||||||
self.frame_statusbar.SetStatusWidths([-1])
|
|
||||||
# statusbar fields
|
|
||||||
frame_statusbar_fields = ["frame_statusbar"]
|
|
||||||
for i in range(len(frame_statusbar_fields)):
|
|
||||||
self.frame_statusbar.SetStatusText(frame_statusbar_fields[i], i)
|
|
||||||
|
|
||||||
# Tool Bar
|
|
||||||
self.frame_toolbar = wx.ToolBar(self, -1)
|
|
||||||
self.SetToolBar(self.frame_toolbar)
|
|
||||||
self.frame_toolbar.Realize()
|
|
||||||
# Tool Bar end
|
|
||||||
|
|
||||||
self.panel_1 = wx.Panel(self, wx.ID_ANY)
|
|
||||||
|
|
||||||
grid_sizer_1 = wx.GridBagSizer(0, 0)
|
|
||||||
|
|
||||||
sizer_1 = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
grid_sizer_1.Add(sizer_1, (0, 0), (2, 1), wx.EXPAND, 0)
|
|
||||||
|
|
||||||
label_1 = wx.StaticText(self.panel_1, wx.ID_ANY, "Text1")
|
|
||||||
sizer_1.Add(label_1, 0, 0, 0)
|
|
||||||
|
|
||||||
label_2 = wx.StaticText(self.panel_1, wx.ID_ANY, u"Für")
|
|
||||||
sizer_1.Add(label_2, 0, 0, 0)
|
|
||||||
|
|
||||||
label_3 = wx.StaticText(self.panel_1, wx.ID_ANY, "Statis")
|
|
||||||
sizer_1.Add(label_3, 0, 0, 0)
|
|
||||||
|
|
||||||
self.notebook_1 = wx.Notebook(self.panel_1, wx.ID_ANY)
|
|
||||||
grid_sizer_1.Add(self.notebook_1, (0, 1), (1, 1), wx.EXPAND, 0)
|
|
||||||
|
|
||||||
self.notebook_1_pane_1 = wx.Panel(self.notebook_1, wx.ID_ANY)
|
|
||||||
self.notebook_1.AddPage(self.notebook_1_pane_1, "notebook_1_pane_1")
|
|
||||||
|
|
||||||
self.notebook_1_pane_2 = wx.Panel(self.notebook_1, wx.ID_ANY)
|
|
||||||
self.notebook_1.AddPage(self.notebook_1_pane_2, "notebook_1_pane_2")
|
|
||||||
|
|
||||||
self.notebook_1_pane_3 = wx.Panel(self.notebook_1, wx.ID_ANY)
|
|
||||||
self.notebook_1.AddPage(self.notebook_1_pane_3, "notebook_1_pane_3")
|
|
||||||
|
|
||||||
self.notebook_1_pane_4 = wx.Panel(self.notebook_1, wx.ID_ANY)
|
|
||||||
self.notebook_1.AddPage(self.notebook_1_pane_4, "notebook_1_pane_4")
|
|
||||||
|
|
||||||
grid_sizer_3 = wx.GridBagSizer(10, 0)
|
|
||||||
grid_sizer_1.Add(grid_sizer_3, (0, 2), (2, 1), wx.EXPAND, 0)
|
|
||||||
|
|
||||||
grid_sizer_4 = wx.GridBagSizer(0, 0)
|
|
||||||
grid_sizer_3.Add(grid_sizer_4, (0, 0), (1, 1), wx.EXPAND, 0)
|
|
||||||
|
|
||||||
self.button_1 = wx.Button(self.panel_1, wx.ID_ANY, "button_1")
|
|
||||||
grid_sizer_4.Add(self.button_1, (0, 0), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
self.button_2 = wx.Button(self.panel_1, wx.ID_ANY, "button_2")
|
|
||||||
grid_sizer_4.Add(self.button_2, (1, 0), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
self.button_3 = wx.Button(self.panel_1, wx.ID_ANY, "button_3")
|
|
||||||
grid_sizer_4.Add(self.button_3, (2, 0), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
grid_sizer_5 = wx.GridBagSizer(0, 0)
|
|
||||||
grid_sizer_3.Add(grid_sizer_5, (1, 0), (1, 1), wx.EXPAND, 0)
|
|
||||||
|
|
||||||
self.button_7 = wx.Button(self.panel_1, wx.ID_ANY, "button_7")
|
|
||||||
grid_sizer_5.Add(self.button_7, (0, 0), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
self.button_8 = wx.Button(self.panel_1, wx.ID_ANY, "button_8")
|
|
||||||
grid_sizer_5.Add(self.button_8, (1, 0), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
self.button_9 = wx.Button(self.panel_1, wx.ID_ANY, "button_9")
|
|
||||||
grid_sizer_5.Add(self.button_9, (2, 0), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
grid_sizer_2 = wx.GridBagSizer(0, 0)
|
|
||||||
grid_sizer_1.Add(grid_sizer_2, (1, 1), (1, 1), wx.EXPAND, 0)
|
|
||||||
|
|
||||||
self.button_4 = wx.Button(self.panel_1, wx.ID_ANY, "button_4")
|
|
||||||
grid_sizer_2.Add(self.button_4, (0, 0), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
self.button_5 = wx.Button(self.panel_1, wx.ID_ANY, "button_5")
|
|
||||||
grid_sizer_2.Add(self.button_5, (0, 1), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
self.button_6 = wx.Button(self.panel_1, wx.ID_ANY, "button_6")
|
|
||||||
grid_sizer_2.Add(self.button_6, (0, 2), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
self.panel_1.SetSizer(grid_sizer_1)
|
|
||||||
|
|
||||||
self.Layout()
|
|
||||||
|
|
||||||
# end wxGlade
|
|
||||||
|
|
||||||
def test(self, event): # wxGlade: MyFrame.<event_handler>
|
|
||||||
print("Event handler 'test' not implemented!")
|
|
||||||
event.Skip()
|
|
||||||
|
|
||||||
# end of class MyFrame
|
|
||||||
|
|
||||||
class MyApp(wx.App):
|
|
||||||
def OnInit(self):
|
|
||||||
self.frame = MyFrame(None, wx.ID_ANY, "")
|
|
||||||
self.SetTopWindow(self.frame)
|
|
||||||
self.frame.Show()
|
|
||||||
return True
|
|
||||||
|
|
||||||
# end of class MyApp
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
app = MyApp(0)
|
|
||||||
app.MainLoop()
|
|
@ -1,117 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
# -*- coding: UTF-8 -*-
|
|
||||||
#
|
|
||||||
# generated by wxGlade 1.0.2 on Sun Jul 4 21:20:06 2021
|
|
||||||
#
|
|
||||||
|
|
||||||
import wx
|
|
||||||
|
|
||||||
# begin wxGlade: dependencies
|
|
||||||
# end wxGlade
|
|
||||||
|
|
||||||
# begin wxGlade: extracode
|
|
||||||
# end wxGlade
|
|
||||||
|
|
||||||
|
|
||||||
class MyFrame(wx.Frame):
|
|
||||||
def __init__(self, *args, **kwds):
|
|
||||||
# begin wxGlade: MyFrame.__init__
|
|
||||||
kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
|
|
||||||
wx.Frame.__init__(self, *args, **kwds)
|
|
||||||
self.SetSize((474, 290))
|
|
||||||
self.SetTitle("frame")
|
|
||||||
|
|
||||||
# Menu Bar
|
|
||||||
self.frame_menubar = wx.MenuBar()
|
|
||||||
self.SetMenuBar(self.frame_menubar)
|
|
||||||
# Menu Bar end
|
|
||||||
|
|
||||||
self.panel_1 = wx.Panel(self, wx.ID_ANY)
|
|
||||||
|
|
||||||
grid_sizer_1 = wx.GridBagSizer(0, 0)
|
|
||||||
|
|
||||||
sizer_1 = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
grid_sizer_1.Add(sizer_1, (0, 0), (2, 1), wx.EXPAND, 0)
|
|
||||||
|
|
||||||
label_1 = wx.StaticText(self.panel_1, wx.ID_ANY, "Text1")
|
|
||||||
sizer_1.Add(label_1, 0, 0, 0)
|
|
||||||
|
|
||||||
label_2 = wx.StaticText(self.panel_1, wx.ID_ANY, u"Für")
|
|
||||||
sizer_1.Add(label_2, 0, 0, 0)
|
|
||||||
|
|
||||||
label_3 = wx.StaticText(self.panel_1, wx.ID_ANY, "Statis")
|
|
||||||
sizer_1.Add(label_3, 0, 0, 0)
|
|
||||||
|
|
||||||
self.notebook_1 = wx.Notebook(self.panel_1, wx.ID_ANY)
|
|
||||||
grid_sizer_1.Add(self.notebook_1, (0, 1), (1, 1), wx.EXPAND, 0)
|
|
||||||
|
|
||||||
self.notebook_1_pane_1 = wx.Panel(self.notebook_1, wx.ID_ANY)
|
|
||||||
self.notebook_1.AddPage(self.notebook_1_pane_1, "notebook_1_pane_1")
|
|
||||||
|
|
||||||
self.notebook_1_pane_2 = wx.Panel(self.notebook_1, wx.ID_ANY)
|
|
||||||
self.notebook_1.AddPage(self.notebook_1_pane_2, "notebook_1_pane_2")
|
|
||||||
|
|
||||||
self.notebook_1_pane_3 = wx.Panel(self.notebook_1, wx.ID_ANY)
|
|
||||||
self.notebook_1.AddPage(self.notebook_1_pane_3, "notebook_1_pane_3")
|
|
||||||
|
|
||||||
self.notebook_1_pane_4 = wx.Panel(self.notebook_1, wx.ID_ANY)
|
|
||||||
self.notebook_1.AddPage(self.notebook_1_pane_4, "notebook_1_pane_4")
|
|
||||||
|
|
||||||
grid_sizer_3 = wx.GridBagSizer(10, 0)
|
|
||||||
grid_sizer_1.Add(grid_sizer_3, (0, 2), (2, 1), wx.EXPAND, 0)
|
|
||||||
|
|
||||||
grid_sizer_4 = wx.GridBagSizer(0, 0)
|
|
||||||
grid_sizer_3.Add(grid_sizer_4, (0, 0), (1, 1), wx.EXPAND, 0)
|
|
||||||
|
|
||||||
self.button_1 = wx.Button(self.panel_1, wx.ID_ANY, "button_1")
|
|
||||||
grid_sizer_4.Add(self.button_1, (0, 0), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
self.button_2 = wx.Button(self.panel_1, wx.ID_ANY, "button_2")
|
|
||||||
grid_sizer_4.Add(self.button_2, (1, 0), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
self.button_3 = wx.Button(self.panel_1, wx.ID_ANY, "button_3")
|
|
||||||
grid_sizer_4.Add(self.button_3, (2, 0), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
grid_sizer_5 = wx.GridBagSizer(0, 0)
|
|
||||||
grid_sizer_3.Add(grid_sizer_5, (1, 0), (1, 1), wx.EXPAND, 0)
|
|
||||||
|
|
||||||
self.button_7 = wx.Button(self.panel_1, wx.ID_ANY, "button_7")
|
|
||||||
grid_sizer_5.Add(self.button_7, (0, 0), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
self.button_8 = wx.Button(self.panel_1, wx.ID_ANY, "button_8")
|
|
||||||
grid_sizer_5.Add(self.button_8, (1, 0), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
self.button_9 = wx.Button(self.panel_1, wx.ID_ANY, "button_9")
|
|
||||||
grid_sizer_5.Add(self.button_9, (2, 0), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
grid_sizer_2 = wx.GridBagSizer(0, 0)
|
|
||||||
grid_sizer_1.Add(grid_sizer_2, (1, 1), (1, 1), wx.EXPAND, 0)
|
|
||||||
|
|
||||||
self.button_4 = wx.Button(self.panel_1, wx.ID_ANY, "button_4")
|
|
||||||
grid_sizer_2.Add(self.button_4, (0, 0), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
self.button_5 = wx.Button(self.panel_1, wx.ID_ANY, "button_5")
|
|
||||||
grid_sizer_2.Add(self.button_5, (0, 1), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
self.button_6 = wx.Button(self.panel_1, wx.ID_ANY, "button_6")
|
|
||||||
grid_sizer_2.Add(self.button_6, (0, 2), (1, 1), 0, 0)
|
|
||||||
|
|
||||||
self.panel_1.SetSizer(grid_sizer_1)
|
|
||||||
|
|
||||||
self.Layout()
|
|
||||||
# end wxGlade
|
|
||||||
|
|
||||||
# end of class MyFrame
|
|
||||||
|
|
||||||
class MyApp(wx.App):
|
|
||||||
def OnInit(self):
|
|
||||||
self.frame = MyFrame(None, wx.ID_ANY, "")
|
|
||||||
self.SetTopWindow(self.frame)
|
|
||||||
self.frame.Show()
|
|
||||||
return True
|
|
||||||
|
|
||||||
# end of class MyApp
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
app = MyApp(0)
|
|
||||||
app.MainLoop()
|
|
9
view.py
9
view.py
@ -53,8 +53,8 @@ class PlotPanel(wx.Panel):
|
|||||||
def init_plot_data(self):
|
def init_plot_data(self):
|
||||||
self.ax = self.fig.add_subplot()
|
self.ax = self.fig.add_subplot()
|
||||||
self.fig.legend()
|
self.fig.legend()
|
||||||
dat = self.model.plot_data
|
self.x, self.y = self.model.sensors["temp"].get_data
|
||||||
(self.im,) = self.ax.plot(dat.get("time"), dat.get("temp"), "-.",label="temp")
|
(self.im,) = self.ax.plot(self.x, self.y, "-.",label="temp")
|
||||||
self.toolbar.update() # Not sure why this is needed - ADS
|
self.toolbar.update() # Not sure why this is needed - ADS
|
||||||
|
|
||||||
def get_toolbar(self):
|
def get_toolbar(self):
|
||||||
@ -63,10 +63,9 @@ class PlotPanel(wx.Panel):
|
|||||||
return self.toolbar
|
return self.toolbar
|
||||||
|
|
||||||
def on_paint(self, event):
|
def on_paint(self, event):
|
||||||
dat = self.model.plot_data.data
|
self.x, self.y = self.model.sensors["temp"].get_data
|
||||||
# print(self.x)
|
# print(self.x)
|
||||||
|
self.im.set_data(self.x, self.y)
|
||||||
self.im.set_data(dat.get("time"), dat.get("temp"))
|
|
||||||
self.ax.relim()
|
self.ax.relim()
|
||||||
self.ax.autoscale_view()
|
self.ax.autoscale_view()
|
||||||
self.canvas.draw()
|
self.canvas.draw()
|
||||||
|
Loading…
Reference in New Issue
Block a user