da ich es für angebracht halte mich erst einmal vorzustellen:
Mein Name ist Philipp bin >40 und von Programmieren hab ich nicht viel Ahnung.
Um dies zu ändern brütet mein Hirn immer wieder (für mich) spannende "Kann man das machen?"-Projekte aus... an denen ich dann meist bei der Programmierung ins Stocken gerate.
Zurzeit hängt es mal wieder und leider waren meine Sucherfolge ehr von schwachem Erfolg gekrönt. Wahrscheinlich liegt es auch daran, dass ich das Problem nicht korrekt in Worte, geschweige den mit den richtigen Fachbegriffen umschreiben kann...
Was will ich:
ein Raspi soll ein BMP180 auslesen und den Luftdruck, korrigiert um ein Offset, auf ein touch tft (im Vollbildmodus, der Nutzer soll keinen einfachen Zugriff auf den Desktop haben) ausgeben.
- dieses GUI (Normal) soll enthalten: Luftdruck, Uhrzeit, Luftdruck min/max-wert seit Programmstart, ein Button zum Herunterfahren des gesamten Raspi, ein Button zum Starten der Kalibrierung GUI und ein Label welches das Datum der letzten Kalibrierung anzeigt
- eine zweite GUI soll via Fullscreen Touchfeld (Zahlen 1 bis 9, "." , "OK", "Clear", "Abbruch" es ermöglichen den korrekten Luftdruck einzugeben, eine Routine soll dann die Differenz zum realen Messwert ermitteln und den Offset, sowie den Zeitpunkt der Kalibrierung in eine Datei schreiben.
Das Lesen und schreiben der Offset.txt Datei habe ich im Modul BMP180.py integriert, dort werden auch die Summen/Differenzen gebildet.
Womit ich erhebliche Probleme habe ist die Abfolge der GUI Klassen.
Das diese nicht bzw. nur bedingt linear ablaufen ist mir "fast" klar....
Laufen einmal durch und waren dann auf eine Aktion des Nutzers.
Nun soll aber das Label Druck regelmäßig (Intervall kann 1 min betragen, nicht Zeitkritisch!) neu dargestellt werden, nachdem der Luftdruck ausgelesen wurde, oder eine neue Kalibrierung gemacht wurde (Dann natürlich auch ein neue LastCalDatum).
Bei meinem Versuch aus "def Messen():" ein update in der Klasse Normal auszulösen geht was schief.
Da ich hier nicht weiter weis, hab ich das Listing angehangen und für die, nur auf dem Raspi laufenden Modul, feste Werte vorgegeben sowie den Vollbildmodus deaktiviert.
(das auslesen und der Vollbildmodus funktionieren)
Was ich bisher verstanden habe ist, dass der Aufruf von Normal.update aus Messen() einen zweiten Screen über den ersten legt und dabei ausser den zwei Button nix darstellt... doof...
Ich vermute ich muss beim Aufrufen irgend wie eine Referenz auf den bereits dargestellten Screen herstellen, damit dann die Textvariablen mit neuen Inhalt gefüllt werden und auf dem Screen dargestellt werden... nur wie und wo bekomme ich die Referenzierung hin?
Ich hoffe mir kann das jemand erklären....
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
# GUI
import time
import Tkinter
#import bmp as BMP180
Value_min = 1200.0
Value_max = 0.0
class Cal_tk(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self,parent)
self.parent = parent
self.initialize()
def initialize(self):
self.grid()
self.overrideredirect(1)
w, h = (self.winfo_screenwidth()/4), (self.winfo_screenheight()/4)
self.geometry("%dx%d+0+0" % (w, h))
self.rowconfigure((0,12), weight=1)
self.columnconfigure((0,3), weight=1)
OK_CAL = Tkinter.Button(self, text = "OK", command = self.OK_Click)
OK_CAL.grid (row=10, column=1, rowspan=1, columnspan=1)
def OK_Click(self):
print("Kalibrierung OK")
class Normal_tk(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self,parent)
self.parent = parent
self.initialize()
def initialize(self):
self.miniscreen = 4 # 1 für Umgebung RPI; 4 für Entwicklung auf Desktop
self.grid()
if (self.miniscreen == 1):
self.overrideredirect(1)
w, h = (self.winfo_screenwidth()/self.miniscreen), (self.winfo_screenheight()/self.miniscreen)
self.geometry("%dx%d+0+0" % (w, h))
self.rowconfigure((0,12), weight=1)
self.columnconfigure((0,3), weight=1)
self.LastCal = Tkinter.StringVar()
self.LastCal.set(str("DatumCal"))
self.Zeit = Tkinter.StringVar()
self.Zeit.set(time.strftime("%d.%m.%Y %H:%M:%S"))
self.Druck = Tkinter.StringVar()
self.Druck.set (1013.12)
self.Max_Druck = Tkinter.StringVar()
self.Max_Druck.set(str("Pmax_sample"))
self.Min_Druck = Tkinter.StringVar()
self.Min_Druck.set(str("Pmin_sample"))
#Buttons
Start_CAL = Tkinter.Button(self, text = "Neue Kalibrierung starten", command = self.On_StartCal_Click)
Start_CAL.grid (row=10, column=1, rowspan=1, columnspan=1)
Stop_button = Tkinter.Button(self, text=" Shutdown ", command = self.On_Shutdown_Click)
Stop_button.grid (row=12, column=1, rowspan=1, columnspan=1)
#Dynamic Label
Label_Druck = (Tkinter.Label(self, textvariable = str(self.Druck),
foreground="red", font=("Arial", "15", "bold")).
grid (row=0, column=1, rowspan=1, columnspan=1))
Label_Zeit = (Tkinter.Label(self, textvariable = str(self.Zeit)).
grid (row=1, column=1, rowspan=1, columnspan=1))
Label_Max_Druck = (Tkinter.Label(self, textvariable = self.Max_Druck).
grid (row=3, column=1, rowspan=1, columnspan=1))
Label_Min_Druck = (Tkinter.Label(self, textvariable = self.Min_Druck).
grid (row=4, column=1, rowspan=1, columnspan=1))
LastCal_Label = (Tkinter.Label(self, textvariable = self.LastCal).
grid (row=9, column=1, columnspan=1))
def update(DatumCal, P_Sample, Pmin_sample, Pmax_sample):
Zeit.set(time.strftime("%d.%m.%Y %H:%M:%S"))
LastCal.set(DatumCal)
self.Druck.set(str("aktueller Wert: " + str(P_sample) + " hPa"))
self.Max_Druck.set(str("maximaler Wert: " + str(self.Pmin_sample) + " hPa"))
self.Min_Druck.set(str("minimaler Wert: " + str(self.Pmax_sample) + " hPa"))
def On_Shutdown_Click(self):
print("Shutdown")
#Raspi sudo init 0
def On_StartCal_Click(self):
print("Neue Kalibrierung")
# sprung zur Kalibrierung...
def Messwerte_lesen():
Mittelwert_Druck = 0.0
#(LastCalDate, akt_offset) = BMP180.read_offsetfile()
(LastCalDate, akt_offset) = ("01.09.2015", -1.0)
for x in range (0,20):
#(Temp, Druck) = BMP180.readBmp180()
(Temp, Druck) = (110, 1013.23)
Mitwert_Druck = Mittelwert_Druck + Druck
Druck = round(float(Mittelwert_Druck/20.0)+ float(akt_offset), 2)
time.sleep(0.1)
Normal_tk(None).update(LastCalDate, Druck, Druck-1.0, Druck+1.0)
if __name__ == "__main__":
app = Normal_tk(None)
app.after(500, Messwerte_lesen)
app.mainloop()

.