Labelvariable aktualisieren

Fragen zu Tkinter.
Antworten
kruzifikator
User
Beiträge: 9
Registriert: Freitag 26. Oktober 2018, 13:18
Wohnort: München

Hallo miteinander,

ich bin noch ziemlicher Python-Neuling und brauche die Hilfe von euch Experten.

1. Die Imports von Tkinter, wie mache ich das am besten, wenn ich irgendwas wegnehme läuft meine Shell rot an?

2. Nun zum Hauptpunkt: Ich habe da ein kleines Programm geschrieben, mithilfe dessen die Mitarbeiter Zeiten von der Produktion für die Arbeitsvorbereitung nachtragen können sollen. Soweit läuft alles, bin sehr zufrieden mit mir, dafür dass es mein erstes Programm ist. Also Mitarbeiter trägt die Daten in die Entry Widgets ein und mit speichern werden sie direkt in einer Datei gespeichert. Läuft alles Tip Top. ABER ich hab mir eingebildet einen Live-Ticker zu implementieren. Wenn man auf aktualisieren klickt, soll er die Datei durchforsten, in einer Liste speichern und die Gesamtsumme nun als Label Variable oben rechts anzeigen.

Kurzum alles läuft bisher außer, dass der Inhalt des Labels "dataLabel" nicht aktualisiert wird, wie mache ich das am besten?

3. Habt ihr noch Anregungen für meinen Code?


Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-


# Einzugeben sind nur Auftrag, Arbeitsgang und Zeit, Maschine kann direkt ausgewählt werden. da
# alle Maschinen ( Kostenstellen ) eingebettet sind.
# GUI wird Framework- und Lizenzunabhängig mit Tkinter visualisiert

#TO DO
#Live-Ticker Auswertung bisherige mannlose Stunden

import csv
import os
import sys
import time
import tkinter as tk
from tkinter import *
from tkinter import messagebox, Frame, Menu



class GUI(Frame):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
# Hauptfenster
        self.master.title("Ghostshift")
        self.master.configure(background= "#2ECCFA")
# Toolbar generieren
        menubar = Menu(self.master)
        self.master.config(menu=menubar)
        helpMenu = Menu(menubar, tearoff=0)
        helpMenu.add_command(label="Anleitung", command=self.action_get_help_dialog)
        helpMenu.add_command(label="Autor", command=self.action_get_info_dialog)
        menubar.add_cascade(label="Info", menu=helpMenu)   
        
       

#Kostenstellen
        machines = (
            "",
            "470.09", "470.03", "470.05", "421.04", "470.10",
            "470.11", "470.12", "455.04", "455.02", "455.06",
            "442.04", "441.02",  "442.02", "453.01", "453.04"
            )


#Aktualisieren Button erzeugen und anzeigen
        reloadButton = tk.Button(font=("Calibri"), bg="#2ECCFA", text='Aktualisieren', fg='black',
                                relief='groove', activebackground='red',
                                command=self.get_data)
        reloadButton.place(relx = 0.7, rely = 0.8462, relwidth=0.2, relheight=0.1)
        
#Speichern Button erzeugen und anzeigen
        saveButton = tk.Button(font=("Calibri"), bg="#2ECCFA", text='Speichern', fg='black',
                                relief='groove', activebackground='green',
                                command=self.save_entry)
        saveButton.place(relx = 0.4, rely = 0.8462, relwidth=0.2, relheight=0.1)

#Abbruch Button erzeugen und anzeigen
        clearButton = tk.Button(font=("Calibri"), bg="#2ECCFA", text='Abbruch', fg='black',
                                relief='groove', activebackground='red',
                                command=self.clear_entry)
        clearButton.place(relx = 0.1, rely = 0.8462, relwidth=0.2, relheight=0.1)




#Label
        self.GhostLabel = tk.Label(font=("Calibri"), bg="#2ECCFA", text='Mannlose Stunden')
        self.GhostLabel.place(relx = 0.1, rely = 0.0770, relwidth=0.3, relheight=0.1)

        
        var = IntVar(value=0)
        try:
            var = IntVar(value=(sum(data) / 60 ))
        except:
            var.set(value=42)
        self.dataLabel = tk.Label(font=("Calibri"), bg="#2ECCFA", textvariable=var)
        self.dataLabel.place(relx = 0.6, rely = 0.0770, relwidth=0.3, relheight=0.1)
        

        self.assignmentLabel = tk.Label(font=("Calibri"), bg="#2ECCFA", text='Auftrag')
        self.assignmentLabel.place(relx = 0.1, rely = 0.2307, relwidth=0.3, relheight=0.1)
        
        self.operationLabel = tk.Label(font=("Calibri"), bg="#2ECCFA", text='Arbeitsgang')
        self.operationLabel.place(relx = 0.1, rely = 0.3846, relwidth=0.3, relheight=0.1)
        
        self.machineLabel = tk.Label(font=("Calibri"), bg="#2ECCFA", text='Kostenstelle')
        self.machineLabel.place(relx = 0.1, rely = 0.5385, relwidth=0.3, relheight=0.1)
        
        self.timeLabel = tk.Label(font=("Calibri"), bg="#2ECCFA", text='Zeit')
        self.timeLabel.place(relx = 0.1, rely = 0.6923, relwidth=0.3, relheight=0.1)

        
#Eingabefelder
        self.assignmentEntry = tk.Entry(bd=4, relief='sunken')
        self.assignmentEntry.place(relx = 0.6, rely = 0.2307, relwidth=0.3, relheight=0.1)

        self.operationEntry = tk.Entry(bd=4, relief='sunken')
        self.operationEntry.place(relx = 0.6, rely = 0.3846, relwidth=0.3, relheight=0.1)

        self.machineEntry = tk.Spinbox(values=machines, bd=4, relief='sunken')
        self.machineEntry.place(relx = 0.6, rely = 0.5385, relwidth=0.3, relheight=0.1)

        self.timeEntry = tk.Entry(bd=4, relief='sunken')
        self.timeEntry.place(relx = 0.6, rely = 0.6923, relwidth=0.3, relheight=0.1)

        
#Funktionen der Buttons
    def action_get_info_dialog(self):
            m_text = "\
***************************\n\
BLA\n\
***************************"
            messagebox.showinfo(message=m_text, title = "Autor")

    def action_get_help_dialog(self):
            m_text = "\
BLA\n\
"
            messagebox.showinfo(message=m_text, title = "Anleitung")



        
    def clear_entry(self):
            self.assignmentEntry.delete(0, "end")
            self.operationEntry.delete(0, "end")
            self.machineEntry.delete(0, "end")
            self.timeEntry.delete(0, "end")
    
    def save_entry(self):
        NeuerEintrag= []
        NeuerEintrag.append(self.assignmentEntry.get())
        NeuerEintrag.append(self.operationEntry.get())
        NeuerEintrag.append(self.machineEntry.get())
        NeuerEintrag.append(self.timeEntry.get())
        with open('ghostshift.csv', 'a') as file:
            file.write('{0}\n'.format('; '.join(str(n) for n in NeuerEintrag)))
# Benachrichtigungsfenster dass Inhalte X Y gespeichert wurden
            messagebox.showinfo("Bestätigung", "Folgendes wurde gespeichert: \n" +
                                "Auftrag : " + self.assignmentEntry.get() + " ,\n" +
                                "Arbeitsgang : " + self.operationEntry.get() + " ,\n" +
                                "Maschine : " + self.machineEntry.get() + " ,\n" +
                                "Zeit : " + self.timeEntry.get() + " Minuten! "
                                )
            file.close()
        print(NeuerEintrag)

    def get_data(self):
        with open('ghostshift.csv', 'r') as file:
            csv_file = csv.reader(file, delimiter=";")
            data = []
            for line in csv_file:
                print("parse ...")
                data.append(int(line[3]))
                
            print(sum(data) / 60 )
            print("parsing successful")
            var = IntVar(value=78)
            #var.set(value=sum(data))
            dataLabel.after(500, var.set, sum(data))
            

                
        
        
        



# Ende   
def main():
    gui = Tk()
    gui.title("Ghostshift")
    gui.geometry("400x400")
    gui = GUI()
    gui.mainloop()

if __name__ == '__main__':
    main()   
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@kruzifikator:

Anmerkungen zum Code:
Zeile 17: keine *-Importe, das überlädt unkontrolliert Namen im eigenen Namensraum. Bei tkinter ist es üblich `import tkinter as tk` zu schreiben und alle Namen per tk.xxx zu referenzieren, was Du eh schon zum Teil machst.
Zeile 27: die Methode initUI ist überflüssig und kann komplett nach __init__ geschoben werden, wo ja gar nichts initalisiert wird.
Zeile 29: `self.master` wird nirgends definiert.
Zeile 34fff: Variablen- und Funktionsnamen schreibt man per Konvention klein_mit_unterstrich
Zeile 78: `data` ist nirgends definiert, daher bekommst Du einen NameError, den Du aber gar nicht bemerkst, weil Du jeden Fehler (eben auch solche Programmierfehler) per `except` abfängst. Niemals nakte excepts benutzen, sondern nur konkrete Exceptions abfangen, von denen Du weißt, dass sie auftreten und auch sinnvoll eine Fehlerbehandlung machen kannst. PS: einen Wert auf 42 zu setzen ist nicht sinnvoll.
Zeile 114: \ als Zeilenfortsetzungszeichen vermeiden. Hier willst Du eigentlich einen mehrzeiligen String mit """. Was soll das m_ bei m_text?
Zeile 142: zum Schreiben von csv-Dateien gibt es das csv-Modul
Zeile 144: statt mit + Strings zusammenzustückeln, nimm .format
Zeile 150: Dateien die man mit with-Statement öffnet braucht man nicht explizit schließen
Zeile 163: was hat die 78 zu bedeuten?
Zeile 165: dataLabel existiert nicht. Das lokale IntVar-Objekt in get_data hat nichts mit dem in initUI zu tun. Was ist der Sinn, hier after zu verwenden?
Zeile 180: `gui` überschreibt das Tk-Objekt, das Frame-Objekt wird keinem Fenster zugeordnet.
kruzifikator
User
Beiträge: 9
Registriert: Freitag 26. Oktober 2018, 13:18
Wohnort: München

@Sirius3

Danke für die rasche Antwort.


1. Importe Tkinter, wie löse ich das dann am besten?
2. sneak_case ja stimmt
3. soll ich die variable data dann als Ergebnis, vom parsen definieren?
4. die exception hab ich nur grad für mich zum debuggen rein
5. Bei m_text stehen firmen interne Infos die ich jetzt nicht ins I-Net stellen wollte.
6. stimmt .close() hab ich übersehen
7. die 78 war auch zum debuggen, ohne die obige exception kommt nämlich die 78 im Label an deswegen.
8. Kannst du mir deine 2 letzten Punkte näher erklären, genau da brauche ich Hilfe?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kruzifikator: 1. Hat Sirius3 doch erklärt? Die beiden ``from tkinter …``-Importe weglassen und alles so lösen wie das teilweise ja schon mit dem ``import tkinter as tk`` gelöst wurde.

3. Ähm was soll `data` an *der* Stelle im Programmablauf denn überhaupt darstellen? Was sollte denn *dort* geparst werden?

4. Zum Debuggen nimmt man eher Ausnahmebehandlungen mal raus, um sehen zu können welche da konkret kommen und wo die ausgelöst werden. Umgekehrt bekommt man doch *weniger* Informationen, was bei der Fehlersuche normalerweise hinderlich ist.

5. Die Frage ist/war wofür das `m_` im Namen `m_text` steht. *Das* ist doch hoffentlich kein Firmengeheimnis. Den Präfix kennt man halt aus anderen Programmiersprachen, allerdings in einer Bedeutung die bei Python keinen Sinn macht, weswegen man so etwas in Python auch nicht machen sollte. Wenn der Präfix etwas anderes bedeuten soll, dann wird das offensichtlich nicht klar, also ist er dann auch nicht gut, denn Namen sollen dem Leser vermitteln was der Wert dahinter bedeutet und keine kryptischen Rätsel darstellen. :-)

Ich würde übrigens `place()` auch mit relativen Angaben eher nicht verwenden.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
kruzifikator
User
Beiträge: 9
Registriert: Freitag 26. Oktober 2018, 13:18
Wohnort: München

@ __blackjack__

das mit den imports hab ich jetzt hinbekommen.

Also ich parse Werte aus der csv-Datei und die Summe will ich in einem Label ausgeben und immer wenn auf Aktualisieren geklickt wird, soll das Label aktualisiert werden.

das m_text steht für Menü_Text. Danke für den Hinweis. ;)

Hast du einen Tipp wie ich das ganze so gestalten kann das er mir das Label aktualisiert. Ich bin echt noch blutiger Anfanger und da sitze ich seit 3 Tagen dran und komme auf keinen grünen Zweig.

Nachtrag: Ich hab mich mit der after Methode schon eingelesen, aber bei mir im Code läuft es einfach nicht. Ich steh voll aufm Schlauch.
kruzifikator
User
Beiträge: 9
Registriert: Freitag 26. Oktober 2018, 13:18
Wohnort: München

Hab jetzt nochmal einiges angepasst, fällt euch noch was auf, was besser sein könnte, muss das nächste Woche vorlegen. Danke für eure Anregungen haben mir echt geholfen. Stand total aufm Schlauch.

Hier noch eine Beispieldatei zum importieren.

Auftrag1;3;421.04;120
Auftrag2;20;470.11;600
Auftrag3;12;455.04;120
Auftrag4;3;442.02;540
Auftrag5;8;421.05;540
Auftrag6 ;7;470.12;618
Auftrag7 ;6;455.05;696
Auftrag8 ;5;442.03;774
Auftrag9;4; 421.06;852
Auftrag10;4;470.13;930
Auftrag11;3;455.06;1008
Auftrag12;2; 442.04;1086


Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-

# Einzugeben sind nur Auftrag, Arbeitsgang und Zeit, Maschine kann direkt ausgewählt werden. da
# alle Maschinen ( Kostenstellen ) eingebettet sind.
# GUI wird Framework- und Lizenzunabhängig mit Tkinter visualisiert


import csv
import os
import time

try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk

from tkinter import messagebox, Frame, Menu, Tk, IntVar, StringVar, Label, Button



class Application(tk.Tk):
    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        self.title("Ghostshift")
        self.configure(background= "#2ECCFA")
        self.geometry("500x400")
        # widget definitions =========================================================     
        # Toolbar
        self.menubar = Menu(self.master)
        self.config(menu=self.menubar)
        self.helpMenu = Menu(self.menubar, tearoff=0)
        self.helpMenu.add_command(label="Anleitung", command=self.action_get_help_dialog)
        self.helpMenu.add_command(label="Autor", command=self.action_get_info_dialog)
        self.menubar.add_cascade(label="Info", menu=self.helpMenu)
        # Label
        self.label_ghost = tk.Label(self,font=("Calibri"), bg="#2ECCFA", text='Live-Ticker')
        self.label_ghost.place(relx = 0.1, rely = 0.0770, relwidth=0.3, relheight=0.1)
        self.label_result = tk.Label(self,font=("Calibri"), bg="#2ECCFA", text="Bitte neu laden")
        self.label_result.place(relx = 0.6, rely = 0.0770, relwidth=0.3, relheight=0.1)
        self.label_assignment = tk.Label(self,font=("Calibri"), bg="#2ECCFA", text='Auftrag')
        self.label_assignment.place(relx = 0.1, rely = 0.2307, relwidth=0.3, relheight=0.1)
        self.label_operation = tk.Label(self,font=("Calibri"), bg="#2ECCFA", text='Arbeitsgang')
        self.label_operation.place(relx = 0.1, rely = 0.3846, relwidth=0.3, relheight=0.1)
        self.label_machine = tk.Label(self,font=("Calibri"), bg="#2ECCFA", text='Kostenstelle')
        self.label_machine.place(relx = 0.1, rely = 0.5385, relwidth=0.3, relheight=0.1)
        self.label_time = tk.Label(self,font=("Calibri"), bg="#2ECCFA", text='Zeit')
        self.label_time.place(relx = 0.1, rely = 0.6923, relwidth=0.3, relheight=0.1)
        # Kostenstellen
        machines = ("","470.09", "470.03", "470.05", "421.04", "470.10",
                        "470.11", "470.12", "455.04", "455.02", "455.06",
                    "442.04", "441.02",  "442.02", "453.01", "453.04")
        # Buttons
        self.button_reload = tk.Button(font=("Calibri"), bg="#2ECCFA", text='Aktualisieren', fg='black',
                                relief='groove', activebackground='red', command=self.get_data)
        self.button_reload.place(relx = 0.7, rely = 0.8462, relwidth=0.2, relheight=0.1)
        self.button_save = tk.Button(font=("Calibri"), bg="#2ECCFA", text='Speichern', fg='black',
                                relief='groove', activebackground='green', command=self.save_entry)
        self.button_save.place(relx = 0.4, rely = 0.8462, relwidth=0.2, relheight=0.1)
        self.button_clear = tk.Button(font=("Calibri"), bg="#2ECCFA", text='Abbruch', fg='black',
                                relief='groove', activebackground="#2EFEF7", command=self.clear_entry)
        self.button_clear.place(relx = 0.1, rely = 0.8462, relwidth=0.2, relheight=0.1)
        # Eingabefelder
        self.assignmentEntry = tk.Entry(bd=4, relief='sunken')
        self.assignmentEntry.place(relx = 0.6, rely = 0.2307, relwidth=0.3, relheight=0.1)
        self.operationEntry = tk.Entry(bd=4, relief='sunken')
        self.operationEntry.place(relx = 0.6, rely = 0.3846, relwidth=0.3, relheight=0.1)
        self.machineEntry = tk.Spinbox(values=machines, bd=4, relief='sunken')
        self.machineEntry.place(relx = 0.6, rely = 0.5385, relwidth=0.3, relheight=0.1)
        self.timeEntry = tk.Entry(bd=4, relief='sunken')
        self.timeEntry.place(relx = 0.6, rely = 0.6923, relwidth=0.3, relheight=0.1)
    # Funktionen =====================================================================
    def action_get_info_dialog(self):
            info_text = "\
            ***************************\n\
            Autor: \n\
            Datum: 20.10.2018\n\
            Version: 1.06\n\
            ***************************"
            messagebox.showinfo(message=info_text, title = "Autor")

    def action_get_help_dialog(self):
            help_text = "\
            Zuerst den Auftrag richtig eintragen."
            messagebox.showinfo(message=help_text, title = "Anleitung")
  
    def clear_entry(self):
            self.assignmentEntry.delete(0, "end")
            self.operationEntry.delete(0, "end")
            self.machineEntry.delete(0, "end")
            self.timeEntry.delete(0, "end")
    
    def save_entry(self):
        NeuerEintrag= []
        NeuerEintrag.append(self.assignmentEntry.get())
        NeuerEintrag.append(self.operationEntry.get())
        NeuerEintrag.append(self.machineEntry.get())
        NeuerEintrag.append(self.timeEntry.get())
        with open('ghostshift.csv', 'a') as file:
            file.write('{0}\n'.format('; '.join(str(n) for n in NeuerEintrag)))
            messagebox.showinfo("Bestätigung", "Folgendes wurde gespeichert: \n" +
                                "Auftrag : " + self.assignmentEntry.get() + " ,\n" +
                                "Arbeitsgang : " + self.operationEntry.get() + " ,\n" +
                                "Maschine : " + self.machineEntry.get() + " ,\n" +
                                "Zeit : " + self.timeEntry.get() + " Minuten! "
                                )    

    def get_data(self):
        with open('ghostshift.csv', 'r') as file:
            csv_file = csv.reader(file, delimiter=";")
            data = []
            for line in csv_file:
                data.append(int(line[3]))
                
            parsed_times = sum(data) / 60
            self.label_result.config(text=str(parsed_times) + " Stunden")


if __name__ == '__main__':
    Application().mainloop()

Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Erst einen ImportError abfangen, danach aber doch wieder ›tkinter‹ zu importieren, ist unsinnig. Mit alle Namen aus tkinter über tk.xxx ansprechen, war wirklich ALLE gemeint.
Die vielen Labels, die später nie wieder gebraucht werden, an ein Attribut zu binden ist überflüssig.
›machines‹ sollte wohl eine Liste und eine Konstante sein, die am Anfang des Programms definiert wird. Eine Liste mit ›[]‹ zu erzeugen und dann fix 4 Werte per append anzufügen ist umständlich, schreibe die Werte direkt in die []. Die Liste kann man dann auch an .format übergeben, wenn man den Info-Text formatiert. ›time‹ und ›os‹ werden importiert aber nicht gebraucht.
Der literale String 'ghostshift.csv' kommt zweimal vor, sollte also eine Konstante sein. Benutze das csv-Modul, nach dem Trennzeichen kommt kein Leerzeichen. Niemand verbietet, ein „;” in eines der Eingabefelder zu schreiben, was die ganze Datei kaputt macht.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi kruzifikator

Hier deine Anwendung in einem von vielen neuen Kleidern. Gewisse Eigenschaften habe ich so belassen wie du sie gewählt hast.

Code: Alles auswählen

#!/usr/bin/python3

# Einzugeben sind nur Auftrag, Arbeitsgang und Zeit, Maschine kann direkt ausgewählt werden. da
# alle Maschinen ( Kostenstellen ) eingebettet sind.
# GUI wird Framework- und Lizenzunabhängig mit Tkinter visualisiert


import csv
import os
import time

import tkinter as tk
import tkinter.messagebox as messagebox

APP_TITLE = "Ghostshift"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 500
APP_HEIGHT = 400
APP_BG = "#2ECCFA"
APP_FONT = ("Calibri")

class Application(object):
    LABEL_PROPS = dict(font=APP_FONT, bg=APP_BG)
    ENTRY_PROPS = dict(font=APP_FONT, bd=1, relief='sunken')
    BUTTON_PROPS = dict(bd=2, relief='groove', font=APP_FONT, bg="#2ECCFA",
        fg='black')
    
    def __init__(self, main_win, **kwargs):
        self.main_win = main_win
        self.menubar = tk.Menu(main_win, font=APP_FONT)
        main_win.config(menu=self.menubar)
        self.helpMenu = tk.Menu(self.menubar, tearoff=0)
        self.helpMenu.add_command(label="Anleitung", font=APP_FONT,
            command=self.action_get_help_dialog)
        self.helpMenu.add_command(label="Autor", font=APP_FONT,
            command=self.action_get_info_dialog)
        self.menubar.add_cascade(label="Info", menu=self.helpMenu)
        
        self.main_frame = tk.Frame(main_win, bg=APP_BG)
        self.main_frame.pack(expand=True, padx=4, pady=4)
        self.left_frame = tk.Frame(self.main_frame, bg=APP_BG)
        self.left_frame.pack(side='left', fill='y', expand=True, padx=4)
        self.right_frame = tk.Frame(self.main_frame, bg=APP_BG)
        self.right_frame.pack(side='left', fill='y', expand=True)
        
        self.labels = ["Auftrag", "Arbeitsgang", "Kostenstelle", "Zeit (min.)"]
        self.machines = ("","470.09", "470.03", "470.05", "421.04", "470.10",
            "470.11", "470.12", "455.04", "455.02", "455.06", "442.04",
            "441.02",  "442.02", "453.01", "453.04")

        self.entry_vars = list()
        
        tk.Label(self.left_frame, text="Live-Ticker", **self.LABEL_PROPS
            ).pack(fill='x', pady=4)
            
        self.restult_var = tk.StringVar(main_win, "Bitte neu laden")
        tk.Label(self.right_frame, textvariable=self.restult_var,
            **self.LABEL_PROPS).pack(fill='x', pady=4)
        
        for label in self.labels:
            tk.Label(self.left_frame, text=label, **self.LABEL_PROPS
                ).pack(fill='x', pady=4, expand=True)
            entry_var = tk.StringVar()
            if label == "Kostenstelle":
                tk.Spinbox(self.right_frame,
                    values=self.machines, textvariable=entry_var,
                    **self.ENTRY_PROPS).pack(fill='x', pady=4, ipady=4)
            else:
                tk.Entry(self.right_frame, textvariable=entry_var,
                    **self.ENTRY_PROPS).pack(fill='x', pady=4, ipady=4, ipadx=0)
            self.entry_vars.append(entry_var)
            
        self.button_frame = tk.Frame(self.main_win, bg=APP_BG)
        self.button_frame.pack(side='bottom', padx=8, pady=4) #, fill='x')

        self.button_clear = tk.Button(self.button_frame, text='Abbruch', 
            activebackground="#2EFEF7", **self.BUTTON_PROPS,
            command=self.clear_entry)
        self.button_clear.pack(side='left')
            
        self.button_save = tk.Button(self.button_frame, text='Speichern',
            activebackground='green', **self.BUTTON_PROPS,
            command=self.save_entry)
        self.button_save.pack(side='left', padx=8)

        self.button_reload = tk.Button(self.button_frame, text='Aktualisieren',
            activebackground='red', **self.BUTTON_PROPS,
            command=self.get_data)
        self.button_reload.pack(side='left')
                
    def action_get_info_dialog(self):
        info_text = "\
        ***************************\n\
        Autor: \n\
        Datum: 20.10.2018\n\
        Version: 1.06\n\
        ***************************"
        messagebox.showinfo(message=info_text, title = "Autor")

    def action_get_help_dialog(self):
        help_text = "Zuerst den Auftrag richtig eintragen."
        messagebox.showinfo(message=help_text, title = "Anleitung")

    def clear_entry(self):
        for entry_var in self.entry_vars:
            entry_var.set('')
    
    def save_entry(self):
        neuer_eintrag = []
        for entry_var in self.entry_vars:
            neuer_eintrag.append(entry_var.get())
            
        with open('ghostshift.csv', 'a') as file:
            file.write('{0}\n'.format('; '.join(str(n) for n in neuer_eintrag)))
            
        self.entries = ["Auftrag", "Arbeitsgang", "Maschine", "Zeit (min.)"]
        info_message = '\n'
        for index, entry_name in enumerate(self.entries):
            info_message += "{} : {}\n".format(
                entry_name, self.entry_vars[index].get())
                
        messagebox.showinfo(
            "Bestätigung", "Folgendes wurde gespeichert: \n" + info_message)
                                    
    def get_data(self):
        with open('ghostshift.csv', 'r') as file:
            csv_file = csv.reader(file, delimiter=";")
            data = []
            csv_lines = list()
            for line in csv_file:
                print(line)
                try: 
                    index = 3
                    data.append(int(line[index]))
                except IndexError:
                    print("Für Index {} existiert noch kein Einrag!".format(
                        index))
                    return
                csv_lines.append(line)
                
            parsed_times = sum(data) / 60
            self.restult_var.set(str(parsed_times) + " Stunden")

        line_nr = 1
        #self.fill_entries(line_nr, csv_lines)
        
    def fill_entries(self, line_nr, csv_lines):
        try:
            line = csv_lines[line_nr]
        except IndexError:
            print("Der Eintrag existiert noch nicht!")
            return
        print(line)
        
        for index, entry in enumerate(self.entry_vars):
            try:
                data = line[index]
            except IndexError:
                print("Der Eintrag für index {} existiert noch nicht!".format(
                    index))
                return
            entry.set(data)
                                             
def main():
    main_win = tk.Tk()
    main_win.title(APP_TITLE)
    #main_win.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
    #main_win.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
    main_win.configure(background = APP_BG)
    main_win.option_add("*highlightThickness", 0)
    app = Application(main_win)
    
    main_win.mainloop()
 

if __name__ == '__main__':
    main()
Viel Spass. Gruss wuf :-)
Take it easy Mates!
kruzifikator
User
Beiträge: 9
Registriert: Freitag 26. Oktober 2018, 13:18
Wohnort: München

@wuf,

vielen dank für deinen Einsatz. Deine lösung gefällt mir sehr gut.
Antworten