Ich brauch mal ein Beispiel

Fragen zu Tkinter.
Antworten
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

Hallo,

ich programmiere noch nicht lange in Python und möchte nun mein bisher einziges Programm mit einer Oberfläche ausstatten.

Mein Programm soll einmal eine Heizungssteuerung auf einem RaspberryPi werden.
Die Messwerte werden aus einer mySql Datenbank abgefragt/hinterlegt.

Nun sollen die Werte auch auf der Oberfläche angezeigt werden aber ich verstehe einfach nicht wie ich ein solches Fenster in das Programm einbinden muss.

Ich hänge hier mal mein bisheriges Werk an, vielleicht kann mir ja jemand weiterhelfen...

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Import sys module


import sys
import smbus
import time
import json
import MySQLdb as mdb
import RPi.GPIO as GPIO
from time import sleep 

global Anzahl_angeschlossene_sensoren
global anzahl_registrierte_sensoren
global Sensor_Aktiv
global Sensor_ID_anlegen

uhrzeit = time.strftime("%d.%m.%Y um %H:%M:%S Uhr") 


Statusx =  1



def Sensor_aktiv():

    try:
        #print "Speichern: ", Sensor_Aktiv
        con = mdb.connect('192.168.0.200', 'root', '', 'Heizungsteuerung');
        with con:
            cur = con.cursor()
            cur.execute('UPDATE Sensoren SET Aktiv = (%s) WHERE Sensor_ID = (%s)', (uhrzeit ,Sensor_Aktiv))
        #print "Speichern abgeschlossen"
    except:
        print "Fehler Datenbank Heizungsteuerung Sensor_aktiv()"

		
		

def status():
    global mysqlStatus
    global mysqlByte
    global mysqlPort

    try:    
        #GPIO.output(18, True)        

        print "Speichern"
        print Temp_Heizung, " - ", Temp_Dach, Temp_Prozessor, " - ", Status_Heizung, " - ", Status_Pumpe, " - ", Status
        con = mdb.connect('192.168.0.200', 'root', '', 'Heizungsteuerung');
        with con:
            cur = con.cursor()
            cur.execute("""UPDATE Status SET Temp_Heizung = %s, Temp_Dach = %s, Temp_Prozessor = %s, 	Status_Heizung = %s, Status_Pumpe = %s, Status = %s  """ % ( Temp_Heizung, Temp_Dach, Temp_Prozessor, Status_Heizung, Status_Pumpe, Status))
        #print "Speichern abgeschlossen"
        #GPIO.output(18, False)
    except:
        #GPIO.output(26, True)
        #GPIO.output(18, False)
        print "Fehler Datenbank Heizungsteuerung status()"
        #time.sleep(1)
        #GPIO.output(26,False)


def Fehler_log():
    try:          
        print "Fehlerprotokoll"
        con = mdb.connect('192.168.0.200', 'root', '', 'Heizungsteuerung');
        with con:
            cur = con.cursor()        
            cur.execute('INSERT INTO Log (Beschreibung) values(%s)', (Fehlerbeschreibung))
            print "Fehlerprotokoll abgeschlossen"    
    except:
        print "Fehler Datenbank Fehler_log()"
        
        time.sleep(1)

		
		
def Sensor_anlegen():
    try:
        con = mdb.connect('192.168.0.200', 'root', '', 'Heizungsteuerung');
        with con:
            cur = con.cursor()        
            cur.execute('INSERT INTO Sensoren (Sensor_ID) values(%s)', (Sensor_ID_anlegen))
            #print "Fehlerprotokoll abgeschlossen"    
    except:
        print "Fehler Datenbank Sensor_anlegen()" 
        time.sleep(1)

		
		
def Temperatur_messen():
    file = open('/sys/devices/w1_bus_master1/w1_master_slaves')
    w1_slaves = file.readlines()
    file.close()
    
    print("Sensor ID       | Temperature")
    print("-----------------------------")

    for line in w1_slaves:

      w1_slave = line.split("\n")[0]
      file = open('/sys/bus/w1/devices/' + str(w1_slave) + '/w1_slave')
      filecontent = file.read()
      file.close()
      
      stringvalue = filecontent.split("\n")[1].split(" ")[9]
      temperature = float(stringvalue[2:]) / 1000
      
      if temperature == 85:
        print "Fehler"
      else:
        print(str(w1_slave) + " | %5.3f °C" % temperature)


	  
def Sensoren_ID():
    global Anzahl_angeschlossene_sensoren
    time.sleep(1)
    lfd_sensoraktiv = 0
    file = open('/sys/devices/w1_bus_master1/w1_master_slaves')
    w1_slaves = file.readlines()
    file.close()
        
    for line in w1_slaves:
      #print w1_slaves
      w1_slave = line.split("\n")[0]
      
      print(str(w1_slave))
      Sensoraktiv[lfd_sensoraktiv] = (str(w1_slave))
      lfd_sensoraktiv = lfd_sensoraktiv + 1
      Anzahl_angeschlossene_sensoren = lfd_sensoraktiv
      print "Anzahl_angeschlossene_sensoren : ", Anzahl_angeschlossene_sensoren 


 
# Hauptprogramm START

print "Sensoren einlesen"
connection = mdb.connect('192.168.0.200', 'root', '', 'Heizungsteuerung');
cursor = connection.cursor()        
# Sensoren aus Datenbank abfragen
cursor.execute('UPDATE Sensoren SET Aktiv = "test"')
time.sleep(1)
connection = mdb.connect('192.168.0.200', 'root', '', 'Heizungsteuerung');
cursor = connection.cursor() 
cursor.execute("SELECT * FROM Sensoren")
result = cursor.fetchall()
lt = time.localtime()
lfd_db = 0
#print lfd_db
for data in result:
    print " Sensor_ID: " + str(data[0]) + " Name: " + str(data[1]) + " Beschreibung: " + str(data[2])
    Sensor = str(data[0])
    Name = str(data[1])
    Beschreibung = data[2]
    
    Sensor_DB[lfd_db] = Sensor
    Name_DB[lfd_db] = Name
    Beschreibung_DB[lfd_db] = Beschreibung
    lfd_db = lfd_db + 1
    anzahl_registrierte_sensoren = str(lfd_db)
    print "Registrierte Sensoren: ", anzahl_registrierte_sensoren


# Eingelesene Sensoren mit vorhandnen vergleichen
Sensoren_ID()

i = 0
test = int(anzahl_registrierte_sensoren)

while i < test:
    
    if Sensor_DB[i] == Sensoraktiv[0]:
            Sensor_Aktiv = Sensoraktiv[0]
            Sensoraktiv[0] = "A" + Sensor_Aktiv
            Sensor_aktiv()
            i = i + 1
    else:
        if Anzahl_angeschlossene_sensoren > 1:
            if Sensor_DB[i] == Sensoraktiv[1]:
                Sensor_Aktiv = Sensoraktiv[1]
                Sensoraktiv[1] = "A" + Sensor_Aktiv
                Sensor_aktiv()
                i = i + 1
            else:
                if Anzahl_angeschlossene_sensoren > 2:
                    if Sensor_DB[i] == Sensoraktiv[2]:
                        Sensor_Aktiv = Sensoraktiv[2]
                        Sensoraktiv[2] = "A" + Sensor_Aktiv
                        Sensor_aktiv()
                        i = i + 1
                    else:
                        if Anzahl_angeschlossene_sensoren > 3:
                            if Sensor_DB[i] == Sensoraktiv[3]:
                                Sensor_Aktiv = Sensoraktiv[3]
                                Sensoraktiv[3] = "A" + Sensor_Aktiv
                                Sensor_aktiv()
                                i = i + 1
                            else:
                                if Anzahl_angeschlossene_sensoren > 4:
                                    if Sensor_DB[i] == Sensoraktiv[4]:
                                        Sensor_Aktiv = Sensoraktiv[4]
                                        Sensoraktiv[4] = "A" + Sensor_Aktiv
                                        Sensor_aktiv()
                                        i = i + 1
                                    else:
                                        print "Datenbanksensor: ", Sensor_DB[i], " nicht gefunden - maximum erreicht"
                                        i = i + 1
                                else:
                                    print "Datenbanksensor: ", Sensor_DB[i], " nicht gefunden"
                                    i = i + 1
                        else:
                            print "Datenbanksensor: ", Sensor_DB[i], " nicht gefunden"
                            i = i + 1
                else:
                    print "Datenbanksensor: ", Sensor_DB[i], " nicht gefunden"
                    i = i + 1
        else:
            print "Datenbanksensor: ", Sensor_DB[i], " nicht gefunden"
            i = i + 1


# Aktive und registrierte Sensoren identifizieren
for i in range(5):
    String = str(Sensoraktiv[i])
    if "A" in String:
        print Sensoraktiv[i]
    else:
        if "-" in String:
            Sensor_ID_anlegen = Sensoraktiv[i]
            Sensor_anlegen()
            print "Angelegt: ", Sensor_ID_anlegen
        else:
            print "kein Sensortype"

# Funktion aus DB auslesen und im Programm verwenden (Primaer-, Sekundaer- und Controllerfuehler)
print "start"
connection = mdb.connect('192.168.0.200', 'root', '', 'Heizungsteuerung');
cursor = connection.cursor()    
cursor.execute("SELECT * FROM Sensoren")
result = cursor.fetchall()
lt = time.localtime()

lfd_db = 0
for data in result:
      
    print " Sensor_ID: " + str(data[0]) + " Name: " + str(data[1]) + " Beschreibung: " + str(data[2])
    Sensor = str(data[0])
    Name = str(data[1])
    Beschreibung = data[2]
    
    Sensor_DB[lfd_db] = Sensor
    Name_DB[lfd_db] = Name
    Beschreibung_DB[lfd_db] = Beschreibung
    lfd_db = lfd_db + 1
    anzahl_registrierte_sensoren = str(lfd_db)
    print "Registrierte Sensoren: ", anzahl_registrierte_sensoren


while Statusx < 20:
    Statusx = Statusx + 1
    
    if Statusx == 18:
        Temperatur_messen()
        Statusx = 1
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Duesentrieb: zähl mal wie oft Du ein mdb.connect in Deinem Programm hast. Sowas wie ein Datenbankzugriff sollte an einer Stelle gekapselt sein, um leicht das Interface ändern zu können.
Parameter dürfen nie direkt in SQL-Statements per Stringformatierung eingefügt werden.
Was soll denn das ab Zeile 172 sein? Eine ausgerollte Schleife mit Variabler Anzahl?
Roll das besser wieder in eine Schleife ein, dann brauchst Du auch nicht 9 Ebenen tief schachteln.
global auf oberster Ebene ist ziemlich unsinnig. In allen anderen Fällen unschön.
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

jetzt war ich erst mal Stolz dass mein Programm sooo gut läuft :cry:
Deine Verbesserungsvorschläge werde ich mir mal ansehen und sicherlich auch ändern.

Aber kannst du mir auch bei meinem eigentlichen Problem helfen?
Das Programm soll nach der Initialisierung auch weiterhin die Temeperatur abfragen und auswerten.
Wie bekomme ich dabei die Variablen in ein Fenster auf die Oberfläche?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Oha... man wundert sich ja als mittlerweile halbwegs erfahrener Programmierer, wie viel Code Leute schreiben können, ohne diesen halbwegs übersichtlich zu halten und zu strukturieren :shock: Sorry, nichts für ungut, Duesentrieb.

Die Zeilen 174 - 223 sind irgend wie... extrem kreativ; wenn man es freundlich ausdrücken will :mrgreen: Wie bist Du denn darauf gekommen? Ich meine das ist Copy-and-Paste Programmierung gepaart mit dem Nachdenken, wie man Fallunterscheidungen in eine ``while``-Schleife reinbringen kann. Du bist nur nicht auf zwei Dinge gekommen:

Erstens hätte man sich sämtliche Einrückungen und Schleifen sparen, wenn man sowieso jeden Fall *einzeln* betrachtet. Das ist ziemlich umständlich, wie Du hier siehst:

Code: Alles auswählen

some_actors = ["a", "b", "c"]
for actor in some_actors:
    if actor == "a":
        # mach etwas mit "a"
    else if actor == "b":
        # mach etwas mit "b"
    else if actor == "c":
        # mach etwas mit "c"

# geht doch auch komplett ohne Schleife!
# mach etwas mit "a"
# mach etwas mit "b"
# mach etwas mit "c"
Zweitens und viel sinnvoller, Du schreibst den Code so, dass Du in einer Schleife *alle* Objekte in *einem* allgemein gehaltenem Code behandeln kannst:

Code: Alles auswählen

some_actors = ["a", "b", "c"]
for actor in some_actors:
    # mache etwas mit "actor"
Ich denke Du solltest den Code da erst einmal überarbeiten :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

Hallo,
danke dass du mich nicht ganz in Grund und Boden gestampft hast :oops:
Aber du hast natürlich Recht!
Ich habe halt versucht mich durch Selbststudium da rein zu arbeiten. Funktioniert ja auch :)
Ich werde deinen Vorschlag einarbeiten.

Wie ich jetzt aber ein Formular da reinstecke, hat mir immer noch keiner verraten
Ein bisschen Strucktur ist ja vorhanden.... :(
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Duesentrieb hat geschrieben: Wie ich jetzt aber ein Formular da reinstecke, hat mir immer noch keiner verraten
Du hast ehrlich gesagt auch keine wirklich konkrete Frage gestellt!

Was hast Du denn schon versucht? Welches GUI-Toolkit soll es denn werden? Was genau scheitert?

Vorweg: Versuche nicht, das bisherige *sofort* mit einer GUI auszustatten! Schreibe zunächst kleine Demo-Scripte, in denen Du mit den verschiedenen, von Dir später benötigten Komponenten *experimentierst*. Bei kurzem Code verstehst und lernst Du schneller, wie man was GUI technisch umsetzt :-)

Edit: Oops... schon wieder nicht darauf geachtet, dass das im Tkinter-Subforum war :oops:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Duesentrieb: Die Antwort ist *gar nicht*. In diese Code auch noch zusätzlich GUI-Code reinzustecken, sofern das überhaupt möglich ist, macht ihn noch unhandlicher. GUI-Code setzt üblicherweise auf vorhandenem Code für die Programmlogik auf. Das heisst wenn Dein Code soweit strukturiert ist, dass man ihn von aussen über Funktionsaufrufe und/oder Klassen und Methoden benutzen kann, dann macht man genau das.
Antworten