einrückproblem?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

hi ho,
ich hab in meinem code (denk ich) ein einrückproblem.
mein code sieht wie folgt aus:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8


import datetime
import time
import errno
import os
import sqlite3
from Tkinter import *
import tkMessageBox
import numpy



def ueberSicht():

    base_path = r'C:\Users\DMD-OL\Desktop\Verwaltung Arbeitszeit\Monat'
    try:
        os.makedirs(base_path)
    except OSError as error:
        if error.errno != errno.EEXIST:
            raise
    dirname = 'C:\Users\DMD-OL\Desktop\Verwaltung Arbeitszeit\Monat'
    objects = os.listdir(dirname)
    result = []
    liste = []
    ist = []
    soll = []
    ueber = []
    for objectname in objects:
        objectpath = dirname + "/" + objectname
        otype = "dir"
        if (otype == "all" or
            (otype == "dir"  and os.path.isdir(objectpath)  == True)):
            result.append(objectname)
        datei='%s\\adressenliste.db' % (objectpath)
        con = sqlite3.connect(datei)
        try:
            try:


                ktoNum = 0
#------------------------------------------------------------------------------------------------------------------------------------------------

                so_Mo = 9
                so_Di = 9
                so_Mi = 9
                so_Do = 9
                so_Fr = 4
                so_Sa = 0
                so_So = 0

#------------------------------------------------------------------------------------------------------------------------------------------------
                cursor = con.cursor()
                cursor.execute('''SELECT ktoNum, vorname, nachname, gebdat, wohnort, ktoStand, erstePause, zweitePause FROM adressenliste WHERE ktoNum=?''', (ktoNum,))
                aktuellesKonto = cursor.fetchone()
                if aktuellesKonto != None:
                    cursor = con.cursor()
                    cursor.execute('''SELECT ktoNum, vorname, nachname, gebdat, wohnort FROM adressenliste WHERE ktoNum=?''', (ktoNum,))
                    for row in cursor:

                        name = ('{1} {2}'.format(row[0], row[1],row[2],row[3], row[4]))
                        nummer = ('{0}'.format(row[0], row[1],row[2],row[3], row[4]))
                        gebdat = ('{3}'.format(row[0], row[1],row[2],row[3], row[4]))
                        wohnort = ('{4}'.format(row[0], row[1],row[2],row[3], row[4]))
                for index in result:
                    print index
                    index = '%s' %(index)
                    now = time.strptime(index, '%d.%m.%Y')
                    date = datetime.date(now.tm_year,now.tm_mon, now.tm_mday)
                    wto = date.weekday()
                    monat = time.strftime("%B %Y")
                    shifts = [0, -1, -2, -3, -4, -5, +1]
                    offset = shifts[wto]
                    if offset == 0:
                        offset = so_Mo
                    elif offset == -1:
                        offset = so_Di
                    elif offset == -2:
                        offset = so_Mi
                    elif offset == -3:
                        offset = so_Do
                    elif offset == -4:
                        offset = so_Fr
                    elif offset == -5:
                        offset = so_Sa
                    elif offset == +1:
                        offset = so_So
                con = sqlite3.connect(datei)
                cursor = con.cursor()
                cursor.execute('''SELECT id, ktoNum, vorname, nachname, gebdat, wohnort, ktoStand, erstePause, zweitePause FROM adressenliste WHERE ktoNum=?''', (ktoNum,))
                for column in cursor:
                    ueberStd = column[6] - offset
                    konto = [objectname, column[6], offset, ueberStd]
                    liste.append(konto)
                    ist.append(column[6])
                    soll.append(offset)
                    ueber.append(ueberStd)
                else:
                    if aktuellesKonto == None:
                        label123.configure(text=('In Konto: '+str(ktoNum)+' sind bisher keine Arbeitsstunden verzeichnet!\nDies kann ueber '+"'"+'KONTO WAEHLEN'+"'"+' gemacht werden.'))
                        break
                istSum = numpy.sum(ist)
                sollSum = numpy.sum(soll)
                ueberSum = numpy.sum(ueber)

                window_4= Tk()
                window_4.geometry('+800+200')
                window_4.title('GUI-Verwaltung')

                for row, items in enumerate(liste):
                    for column, item in enumerate(items):

                        label_0 = Label(window_4, text=("' KONTOUEBERSICHT '"),font=('Arial', 12, 'bold underline'), height=3, width=20, fg="#000000000", justify='left')
                        label_0.grid(row=0, column=0, columnspan=2)
                        label_1 = Label(window_4, text=(monat), font=('Arial', 12, 'bold underline'), height=1, width=20, fg="#000000000", justify='center')
                        label_1.grid(row=1, column=0, columnspan=2)
                        label_2 = Label(window_4, height=3,width=20, fg="#000000000", justify='center')
                        label_2.grid(row=2, column=0)
                        label_3 = Label(window_4,text=('Kontonummer:'),font=('Arial', 9, 'bold'), height=1,width=20, relief="groove", fg="#000000000", justify='center')
                        label_3.grid(row=3, column=0)
                        label_4 = Label(window_4,text=(nummer),font=('Arial', 9, 'bold'),height=1,width=20, relief="groove",   fg="#000000000", justify='center')
                        label_4.grid(row=3, column=1)
                        label_5 = Label(window_4,text=('Name:'),font=('Arial', 9, 'bold'), height=1,width=20,relief="groove",  fg="#000000000", justify='center')
                        label_5.grid(row=4, column=0)
                        label_6 = Label(window_4,text=(name),font=('Arial', 9, 'bold'),height=1,width=20, relief="groove", fg="#000000000", justify='center')
                        label_6.grid(row=4, column=1)
                        label_7 = Label(window_4,text=('Geburtsdatum:'),font=('Arial', 9, 'bold'), height=1,width=20,relief="groove",  fg="#000000000", justify='center')
                        label_7.grid(row=5, column=0)
                        label_8 = Label(window_4,text=(gebdat),font=('Arial', 9, 'bold'),height=1,width=20, relief="groove", fg="#000000000", justify='center')
                        label_8.grid(row=5, column=1)
                        label_9 = Label(window_4,text=('Wohnort:'),font=('Arial', 9, 'bold'), height=1,width=20,relief="groove",  fg="#000000000", justify='center')
                        label_9.grid(row=6, column=0)
                        label_10 = Label(window_4,text=(wohnort),font=('Arial', 9, 'bold'),height=1,width=20, relief="groove", fg="#000000000", justify='center')
                        label_10.grid(row=6, column=1)
                        label_11 = Label(window_4, height=2,width=20, fg="#000000000", justify='center')
                        label_11.grid(row=7, column=0)
                        gitter = Label(window_4,text=('Datum'),font=('Arial', 9, 'bold'),height=1,width=20, relief="ridge",  bg="#ddddddddd", fg="#000000000", justify='center')
                        gitter.grid(row=8, column=0)
                        gitter = Label(window_4,text=('IST-Stunden'),font=('Arial', 9, 'bold'),height=1,width=20, relief="ridge",  bg="#ddddddddd", fg="#000000000", justify='center')
                        gitter.grid(row=8, column=1)
                        gitter = Label(window_4,text=('SOLL-Stunden'),font=('Arial', 9, 'bold'),height=1,width=20, relief="ridge",  bg="#ddddddddd", fg="#000000000", justify='center')
                        gitter.grid(row=8, column=2)
                        gitter = Label(window_4,text=('UEBER-Stunden'),font=('Arial', 9, 'bold'),height=1,width=20, relief="ridge",  bg="#ddddddddd", fg="#000000000", justify='center')
                        gitter.grid(row=8, column=3)
                        label_12 =Label(window_4, text=item, width=20, relief="sunken",  bg='#eeeee0', fg="#000000000", justify='center').grid(column=column, row=row+9)
                        gitter=Label(window_4, text=('Summe:'), width=20, relief="ridge", font=('Arial', 8, 'bold'), bg='#cdc8b1', fg="#000000000", justify='center').grid(column=0, row=row+10)
                        gitter=Label(window_4, text=(istSum), width=20, relief="ridge",font=('Arial', 8, 'bold'),  bg='#cdc8b1', fg="#000000000", justify='center').grid(column=1, row=row+10)
                        gitter=Label(window_4, text=(sollSum), width=20, relief="ridge",font=('Arial', 8, 'bold'),  bg='#cdc8b1', fg="#000000000", justify='center').grid(column=2, row=row+10)
                        gitter=Label(window_4, text=(ueberSum), width=20, relief="ridge",font=('Arial', 8, 'bold'),  bg='#cdc8b1', fg="#000000000", justify='center').grid(column=3, row=row+10)

                window_4.mainloop()


            except:
                con.rollback()
                import Tkinter
                window = Tkinter.Tk()
                window.wm_withdraw()
                window.geometry("1x1+200+200")
                tkMessageBox.showerror(title="GUI-VERWALTUNG",message="EINGABEFEHLER:\n\nBitte gib eine nichtnegativen ganze Zahl als Kontonummer ein!",parent=window)
        except:
            con.close()


if __name__ == '__main__':
    ueberSicht()

der code läuft jetzt das erste mal durch und gibt mir als ausgabe ein tabellenfenster (mit name und so), in der beispielsweise steht:

Name bla bla

Datum IST-Stunden SOLL-Stunden Ueber-Stunden
21.07.2015 9 9 0


und wenn ich dieses fenster schließe ein zweites ausgabefenster:

Name bla bla

Datum IST-Stunden SOLL-Stunden Ueber-Stunden
21.07.2015 9 9 0
22.07.2015 7 9 -2

ich will aber nur dieses zweite fenster haben.
hab ich irgendwo etwas falsch eingerückt?
ich hoffe, ihr habe einen besseren überblick. ich steig da grad net mehr durch :(
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

DMD hat geschrieben:ich hoffe, ihr habe einen besseren überblick. ich steig da grad net mehr durch :(
Dann versuche deinen Code aufzuräumen und besser zu strukturieren ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD: ich glaube, da steigt niemand mehr durch. Teile Deine EINE Funktion in sinnvolle 5-6 Funktionen auf. Achte dabei darauf, nach Aufgaben zu trennen, also GUI, Datenbank und Verarbeitungslogik in Funktionen nicht zu mischen. Allein schon die 5 Listen die Du am Anfang erzeugst und irgendwo füllst, da weiß niemand auf Anhieb, wozu die gut sind. Wenn Du anfängst Variablennamen nach Wochentagen zu benennen, dann machst Du auch was falsch, für so etwas gibt es Listen, die Du ja auch schon an fast gleicher Stelle einsetzt.
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

sorry, habs gefunden!
aber trotzdem danke...:)
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD: hier gibt es in erster Linie nichts zu finden, sondern viel aufzuräumen. Also beherzige die Tipps, sonst wirst Du eher früher als später in noch viel größere Probleme laufen.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

btw. ein guter editor (wie z.b. PyCharm) zeigt dir Einrückungsprobleme an und hilft auch beim refactoring...

Selbst wenn die Syntax ok ist, kann ein editor evtl. an nicht vorhandene Namen anzeigen, das etwas nicht stimmt...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

@DMD: Das `time`-Modul ist hier unnötig, alles was Du damit machst hätte man besser mit dem ebenfalls importierten und benutzen `datetime`-Modul erledigen können.

Sternchenimporte sind Böse™. Damit holst Du alle Namen aus dem importierten Modul in das importierende Modul. Bei `Tkinter` sind das ca. 190 Stück, obwohl Du nur einen ganz kleinen Bruchteil davon verwendest.

Zusätzlich importierst Du das Modul auch noch mal unter seinem Namen — mitten in dieser viel zu langen Funktion. Importe gehören bis auf wenige Ausnahmen alle an den Anfang des Moduls.

`numpy` ist eine unnötige Abhängigkeit. Eine `sum()`-Funktion gibt es bereits als eingebaute Funktion in Python, das heisst dafür braucht man noch nicht einmal ein Modul importieren. Da die Listen die dort aufsummiert werden ansonsten gar nicht gebraucht werden, kann man sich die Listen auch sparen und gleich in der Schleife wo die Listen gefüllt werden, das aufsummieren erledigen. Drei Namen weniger.

Viele Namen halten sich in der Schreibweise nicht an den Style Guide for Python Code, so auch der Funktionsname `ueberSicht()`. Bei dem ist das besonders bitter weil die Grossschreibung von dem `S` überhaupt keinen Sinn macht. Das ist im deutschen *ein* Wort, da schreibt man nicht mittendrin einen Buchstaben gross. Inhaltlich ist der Name fast ironisch für eine Funktion die so gross ist und damit sehr unübersichtlich. ;-)

`objects` ist ein schlechter Name für eine Liste mit Datei-/Verzeichnisnamen. `result` ist ein schlechter Name für eine
Liste, weil Einzahl, und ein schlechter Name für etwas was gar kein (End)ergebnis ist, sondern eine Liste mit Verzeichnisnamen die recht weit am Anfang der Verarbeitung stehen. Das innerhalb der äusseren Schleife diese durch die Schleife wachsende Liste immer wieder auf's neue verarbeitet wird, erscheint mir falsch. Vielleicht meintest Du das ja mit Einrückfehler?

`liste` ist ein schlechter Name weil er nichts über den Inhalt der Liste aussagt. Das ist aber eigentlich die Information die der Leser braucht, was die Werte darin bedeuten, nicht das es sich um eine Liste handelt. `konten` wäre zum Beispiel ein passender Name.

Warum hast Du mit `base_path` und `dirname` zweimal den gleichen Wert an verschiedene Namen gebunden?

Pfadteile setzt man mit `os.path.join()` zusammen und nicht mit Zeichenkettenoperationen.

`otype` ist ein schlechter Name und ausserdem ist es überflüssig/unsinnig eine literalen Wert zuzuweisen und gleich in der nächsten Zeile eine bedingte Anweisung zu verwenden die von diesem Wert abhängt.

An der Stelle haben wir auch wieder einen Logikfehler: Nur wenn der Pfad an der Stelle ein Verzeichnis beschreibt und keine Datei, wird der Name an `result` angehängt. Gleich danach geht es aber mit Code weiter der erwartet das der Pfad ein Verzeichnis beschreibt, und dieser Code wird aber auch ausgeführt — und fällt dann auf die Nase — wenn dem *nicht* so ist.

Es wird an zwei Stellen eine Verbindung zur Datenbank aufgebaut und an den Namen `con` gebunden, aber nur einmal wird am Ende `con.close()` aufgerufen. Ein weiterer Fehler. Ich würde die ``with``-Anweisung und `contextlib.closing()` verwenden um robusteren Code zu schreiben.

Die Datenbankabfragen und wie sie verarbeitet werden, sind dann recht, äh, abenteuerlich, und voller Fehler. Fehler die Ausnahmen führen. Was durch Deine kaputte Ausnahmebehandlung dann dazu führt das dem Benutzer eine Meldung präsentiert wird, die überhaupt nichts mit dem tatsächlichen Problemen zu tun hat. An der Stelle breche ich die Kritik dann mal ab, weil der Code schlicht sinnlos ist.
Antworten