Variable an eine pydatei übergeben

Fragen zu Tkinter.
Antworten
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Ich möchte eine Varable von einem Fenster in eine Py Datei übergeben.

Code: Alles auswählen

import tkinter as tk
from tkinter import Button, Tk, Label

def ausführen():
    variable = "Variable übergeben"
    import versuch

fenster = Tk()
                 
fenster.geometry('100x100')

label = tk.Label(fenster, text=" ")

schaltf1 = tk.Button(fenster, text="Variable übergeben",command=ausführen)

schaltf1.grid(row=0, column=0,sticky='w')


fenster.mainloop()  
Die Py Datei sieht so aus:

Code: Alles auswählen

import tkinter as tk
from tkinter import Button, Tk,Label

#eingabe = variable von Fenster_1

fenster_2 = Tk()
                   
fenster_2.geometry('170x100')
fenster_2.attributes("-topmost", True)

label = tk.Label(fenster_2, text=" ")

#label = tk.Label(fenster_2, text=eingabe)
label = tk.Label(fenster_2, text="Hier sollte Variable angezeigt werden")# variable von Fenster 1
label.grid(row=3, column=0)


fenster_2.mainloop()
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast da zwei Alleinstehende GUI Anwendungen mit mainloop. Die kannst du nicht integrieren. Da muss schon ein Programm sein. Das zweite Skript muss also zb eine Funktion oder Klasse werden, und an die kann man Werte ganz einfach per Konstruktor oder Parameter übergeben.
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

vermutlich wird es etwas einfacher, wenn du erzählst was dein Programm wenn es fertig ist, können soll.

Du willst mit zwei GUI's arbeiten und zwischen denen Strings austauschen? Warum?

Gleich noch vorne weg, du musst dich unbedingt mit Funktionen befassen und wenn du GUI's programmieren willst, benötigst du ziemlich schnell die objektorientierte Programmierung. Das heißt du musst auch Klassen verwenden können.
Lernen kann man das zum Beispiel hier:
https://docs.python.org/3/tutorial/

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine Abkürzungen, wenn Du schaltfläche meinst, schreib nicht nur schaltf1.
Die Geometrie eines Fensters ermittelt Tk selbst, das sollte man nicht vorgeben.

Wenn ich Dich richtig verstehe, willst Du zwei Fenster haben, eines, wo man eine Variable eingibt und dann an das Hauptfenster weitergeht.
So einen Linearen Ablauf hat man bei GUI-Programmen aber nicht, weil man immer Eventbasiert arbeiten muß.
Das ist etwas ungewöhnlich und daher etwas komplizierter. Man muß erst das Hauptfenster anlegen und verstecken, dann als Toplevel das zweite Fenster anlegen und dann auf den Knopfdruck warten, dort das zweite Fenster entfernen und das Hauptfenster wieder anzeigen:

Code: Alles auswählen

import tkinter as tk

class Zweitfenster(tk.Toplevel):
    def __init__(self, hauptfenster):
        tk.Toplevel.__init__(self)
        self.hauptfenster = hauptfenster
        tk.Label(self, text="Variable").pack()
        self.entry = tk.Entry(self)
        self.entry.pack()
        tk.Button(self, text="Variable übergeben",command=self.ausfuehren).pack()

    def ausfuehren(self):
        self.hauptfenster.set_variable(self.entry.get())
        self.hauptfenster.wm_deiconify()
        self.destroy()


class Hauptfenster(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.attributes("-topmost", True)
        self.label = tk.Label(self, text="Hier sollte Variable angezeigt werden")
        self.label.pack()

    def set_variable(self, value):
        self.label['text'] = value


def main():
    hauptfenster = Hauptfenster()
    zweitfenster = Zweitfenster(hauptfenster)
    hauptfenster.withdraw()
    hauptfenster.mainloop()


if __name__ == "__main__":
    main()
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Herzlichen Dank für die rasche Antworten.
Ich habe für mich ein kleines Kassabuch geschrieben. Hier kann ich verschiedene Kassabücher erstellen.
In der Menuleiste habe ich nun einige Auswertungen , wie Saldo, Monatlicher Saldo, Jährliche zusammenfassung usw. geschreiben. Das geht alles.
Mein Problem besteht einfach darin, dass der Code so gross geworden ist. Daher wollte ich die Auswertungen "Auslagern" um einen beseren überblick zu haben.
Das Auslagern geht einwandfrei, jedoch brauche ich dazu den Namen des gewählten Kassabuches vom Hauptfenster.
Dann lasse ich es halt so wie es ist, dachte mir wäre eine kleinigkeit.

#Sirius3 Versuche mal ob ich das so hinkriege. Danke

Gruss
Werner
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich verstehe nicht, warum ein "Auslagern" plötzlich Probleme machen sollte, wenn Du jetzt schon mehrere Fenster hast.
Bei GUIs ist eine gute Strategie, die Auswertung von der Nutzerinteraktion zu trennen. So hat man ein Modul, das die ganzen Rechnungen macht, aber keinen Code für die GUI enthält, also z.B. sehr viel einfacher per Unittest getestet werden kann.

Um Dir bei Deinem konkreten Problem helfen zu können, müßten wir schon den wirklichen Code sehen, denn in Deinem vereinfachten "Beispiel" läßt sich das nicht wirklich ablesen, was Du vorhast.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich denke mal das verursacht Probleme durch due nicht geteilten Modul-globalen Variablen …
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Hier habe ich meinen Code so zusammengekürzt das nur eine Berechnung vorhanden ist.
Jetzt würde ich gerne die Zeilen 62 - 570 "Auslagern".
Hierfür brauche ich die Variablen:
Wer = self.eingabeframe.welche_combox.get()
Nur_Jahr = str(self.eingabeframe.kalender.get_date())[0:4]
monat=str(self.eingabeframe.kalender.get_date())[5:7]

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk,Button, Tk,Entry, END,Label,CENTER
import math 
import pyperclip
from functools import partial

from datetime import datetime
from tkcalendar import DateEntry
import os
import csv
import re

#Arbeitsverzeichnis
arbpf = os.getcwd()     
pfad = (f'{arbpf}\\Daten\\')
    
class HauptFenster(tk.Tk): 
    def __init__(self):
        super().__init__()
        
        self.eingabeframe = EingabeFrame(self)
        self.eingabeframe.pack()

        def monatssaldo():
            Wer = self.eingabeframe.welche_combox.get()
            Nur_Jahr = str(self.eingabeframe.kalender.get_date())[0:4]
            monat=str(self.eingabeframe.kalender.get_date())[5:7]

            class Monatssaldofenstermonat(tk.Tk): 
                def __init__(self):
                    super().__init__()

                    self.eingabeframe = EingabeFrame(self)
                    self.eingabeframe.pack()

            # ------------ Hauptfenstermonat erstellen --------------------------------------------    

                    fenstermonatbreite = 360
                    fenstermonathöhe = 200

                    bildschirm_center_x = self.winfo_screenwidth() / 2 - fenstermonatbreite/2
                    bildschirm_center_y = self.winfo_screenheight() / 2 - fenstermonathöhe/2

                    self.geometry("%dx%d+%d+%d" % (fenstermonatbreite,fenstermonathöhe,bildschirm_center_x, bildschirm_center_y))
                    self.resizable(width=0, height=0) # fenstermonat kann nicht vergrössert werden

                    self.title("Monatssaldo Konto: "+Wer+" "+Nur_Jahr)
                    self.attributes("-topmost", True)

            class EingabeFrame(ttk.Frame):  # Vorteil wenn etwas im Frame geändert werden soll in dieser Classe ändern

                def __init__(self, container):
                    super().__init__(container)

# ---- Auslagern --------------------------------------------------         
        def Monatzu():

            Wer = self.eingabeframe.welche_combox.get()
            Nur_Jahr = str(self.eingabeframe.kalender.get_date())[0:4]

            arbpf = os.getcwd()     
            pfad = (f'{arbpf}\\Daten\\')

            def number_format(zahl):
                zahl = "%.2f" % zahl
                zahl = zahl.replace(",",".")
                nochmal = 1 
                while nochmal:    
                  (zahl,nochmal) = re.subn(r"(\d)(\d\d\d\D)",r"\1'\2",zahl)
                return zahl            

           #---------- KASSSABUCH MONAT ANZEIGEN ---------------------------
            def monatszusammenfassung(): 

                zusammenfassung_erstellen()
                class Table: 

                    def __init__(self,fenster): 

                        for i in range(total_rows): 
                            for j in range(total_columns): 

                                self.e = Entry(fenster,
                                                width=15, 
                                                fg='black', 
                                                background='#fce4f9',#Hintergrundfarbe
                                                bd=2, #Linien dicke
                                                font=('Arial',12),
                                                justify = CENTER)

                                self.e.grid(row=i, column=j) 
                                self.e.insert(END, daten[i][j]) 
                zeile = 0
                with open(pfad+Wer+"_Kassabuch_Monat_"+Nur_Jahr+".kbu", encoding="utf-8", newline='') as f:
                    zeile = zeile+1
                    reader = csv.reader(f)   
                    daten = [tuple(row) for row in reader]

                    total_rows = len(daten)
                    total_columns = len(daten[0]) 
                    fenster = Tk()
                    fenster.title('Monatliche zusammenfassung: '+Nur_Jahr)
                    fenster.attributes("-topmost", True)
                    t = Table(fenster) 
                    fenster.mainloop()        

            # ------ MONATLICHE ZUSAMMENSTELLUNG ---------------------------
            def zusammenfassung_erstellen():  #Monatliche zusammenstellung 

                Januareinnahmen = 0
                Januarausgaben = 0    
                JanuarSaldo = 0   
                Febeinnahmen = 0
                Febausgaben = 0    
                FebSaldo = 0 
                Mareinnahmen = 0
                Marausgaben = 0    
                MarSaldo = 0 
                ApSaldo = 0
                Apeinnahmen = 0
                Apausgaben = 0
                MaiSaldo = 0
                Maieinnahmen = 0
                Maiausgaben = 0
                JunSaldo = 0
                Juneinnahmen = 0 
                Junausgaben = 0
                JuSaldo = 0
                Jueinnahmen = 0 
                Juausgaben = 0
                JuSaldo = 0
                Aueinnahmen = 0 
                Auausgaben = 0
                AuSaldo = 0
                Seeinnahmen = 0 
                Seausgaben = 0
                SeSaldo = 0
                Okeinnahmen = 0 
                Okausgaben = 0
                OkSaldo = 0
                Noeinnahmen = 0 
                Noausgaben = 0
                NoSaldo = 0
                Deeinnahmen = 0 
                Deausgaben = 0
                DeSaldo = 0

                gefunden01=0
                gefunden02=0
                gefunden03=0
                gefunden04=0
                gefunden05=0
                gefunden06=0
                gefunden07=0
                gefunden08=0
                gefunden09=0
                gefunden10=0
                gefunden11=0
                gefunden12=0

                zählermo1 = 0
                zählermo2 = 0
                zählermo3 = 0
                zählermo4 = 0
                zählermo5 = 0
                zählermo6 = 0
                zählermo7 = 0
                zählermo8 = 0
                zählermo9 = 0
                zählermo10 = 0
                zählermo11= 0
                zählermo12 = 0

                pfad_zu = (f'{arbpf}\\Daten\\zusammenstellung\\')

                # Alle Dateien löschen
                for filename in os.listdir(pfad_zu):
                    os.remove(os.path.join(pfad_zu, filename))
                
                # Daten einlesen
                with open(pfad+Wer+"_Kassabuch_"+Nur_Jahr+".kbu", "r") as Datei:

                            for line in Datei:     
                                line_splitted = line.strip().split(";")
                                if line_splitted[0] == "Datum":
                                    pass
                                else: 

                                    Nur_monat = (line_splitted[0])[3:5]
                                    # Monatliche zusammenstellung und in Datei schreiben
                                    if Nur_monat == "01":
                                        Januareinnahmen = (float(line_splitted[1])) + Januareinnahmen
                                        Januarausgaben = (float(line_splitted[2])) + Januarausgaben
                                        JanuarSaldo = Januareinnahmen - Januarausgaben

                                        if zählermo1 == 0:
                                            with open(pfad_zu+Wer+"_mo_1_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa: 
                                                fa.write("Datum;Eingang;Ausgang;Text;Beleg-Nr.\n")
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")

                                            zählermo1 = zählermo1 + 1

                                        else:

                                            with open(pfad_zu+Wer+"_mo_1_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa: #,encoding="utf-8"
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")

                                    elif Nur_monat == "02":
                                        Febeinnahmen = (float(line_splitted[1])) + Febeinnahmen
                                        Febausgaben = (float(line_splitted[2])) + Febausgaben
                                        FebSaldo = Febeinnahmen - Febausgaben

                                        if zählermo2 == 0:
                                            with open(pfad_zu+Wer+"_mo_2_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa: 
                                                fa.write("Datum;Eingang;Ausgang;Text;Beleg-Nr.\n")
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")

                                            zählermo2 = zählermo2 + 1

                                        else:


                                            with open(pfad_zu+Wer+"_mo_2_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa:
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")


                                    elif Nur_monat == "03":
                                        Mareinnahmen = (float(line_splitted[1])) + Mareinnahmen
                                        Marausgaben = (float(line_splitted[2])) + Marausgaben
                                        MarSaldo = Mareinnahmen - Marausgaben

                                        if zählermo3 == 0:
                                            with open(pfad_zu+Wer+"_mo_3_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa: 
                                                fa.write("Datum;Eingang;Ausgang;Text;Beleg-Nr.\n")
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")

                                            zählermo3 = zählermo3 + 1

                                        else:

                                            with open(pfad_zu+Wer+"_mo_3_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa: #,encoding="utf-8"
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")


                                    elif Nur_monat == "04":
                                        Apeinnahmen = (float(line_splitted[1])) + Apeinnahmen
                                        Apausgaben = (float(line_splitted[2])) + Apausgaben
                                        ApSaldo = Apeinnahmen - Apausgaben

                                        if zählermo4 == 0:
                                            with open(pfad_zu+Wer+"_mo_4_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa: 
                                                fa.write("Datum;Eingang;Ausgang;Text;Beleg-Nr.\n")
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")

                                            zählermo4 = zählermo4 + 1

                                        else:

                                            with open(pfad_zu+Wer+"_mo_4_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa:
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")


                                    elif Nur_monat == "05":
                                        Maieinnahmen = (float(line_splitted[1])) + Maieinnahmen
                                        Maiausgaben = (float(line_splitted[2])) + Maiausgaben
                                        MaiSaldo = Maieinnahmen - Maiausgaben

                                        if zählermo5 == 0:
                                            with open(pfad_zu+Wer+"_mo_5_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa: 
                                                fa.write("Datum;Eingang;Ausgang;Text;Beleg-Nr.\n")
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")

                                            zählermo5 = zählermo5 + 1

                                        else:

                                            with open(pfad_zu+Wer+"_mo_5_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa:
                                                fa.write((line_splitted[0]) + ";" 
                                                                         + (line_splitted[1])+";"
                                                                         +(line_splitted[2]) + ";" 
                                                                         + (line_splitted[3])+";" 
                                                                         + (line_splitted[4])+ "\n")

                                    elif Nur_monat == "06":
                                        Juneinnahmen = (float(line_splitted[1])) + Juneinnahmen
                                        Junausgaben = (float(line_splitted[2])) + Junausgaben
                                        JunSaldo = Juneinnahmen - Junausgaben

                                        if zählermo6 == 0:
                                            with open(pfad_zu+Wer+"_mo_6_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa: 
                                                fa.write("Datum;Eingang;Ausgang;Text;Beleg-Nr.\n")
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")

                                            zählermo6 = zählermo6 + 1

                                        else:

                                            with open(pfad_zu+Wer+"_mo_6_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa:
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")


                                    elif Nur_monat == "07":
                                        Jueinnahmen = (float(line_splitted[1])) + Jueinnahmen
                                        Juausgaben = (float(line_splitted[2])) + Juausgaben
                                        JuSaldo = Jueinnahmen - Juausgaben

                                        if zählermo7 == 0:
                                            with open(pfad_zu+Wer+"_mo_7_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa: 
                                                fa.write("Datum;Eingang;Ausgang;Text;Beleg-Nr.\n")
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")

                                            zählermo7 = zählermo7 + 1

                                        else:

                                            with open(pfad_zu+Wer+"_mo_7_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa:
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")


                                    elif Nur_monat == "08":
                                        Aueinnahmen = (float(line_splitted[1])) + Aueinnahmen
                                        Auausgaben = (float(line_splitted[2])) + Auausgaben
                                        AuSaldo = Aueinnahmen - Auausgaben

                                        if zählermo8 == 0:
                                            with open(pfad_zu+Wer+"_mo_8_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa: 
                                                fa.write("Datum;Eingang;Ausgang;Text;Beleg-Nr.\n")
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")

                                            zählermo8 = zählermo8 + 1

                                        else:

                                            with open(pfad_zu+Wer+"_mo_8_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa:
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")                                          


                                    elif Nur_monat == "09":
                                        Seeinnahmen = (float(line_splitted[1])) + Seeinnahmen
                                        Seausgaben = (float(line_splitted[2])) + Seausgaben
                                        SeSaldo = Seeinnahmen - Seausgaben

                                        if zählermo9 == 0:
                                            with open(pfad_zu+Wer+"_mo_9_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa: 
                                                fa.write("Datum;Eingang;Ausgang;Text;Beleg-Nr.\n")
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")

                                            zählermo9 = zählermo9 + 1

                                        else:

                                            with open(pfad_zu+Wer+"_mo_9_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa:
                                                fa.write((line_splitted[0]) + ";" 
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";" 
                                                         + (line_splitted[3])+";" 
                                                         + (line_splitted[4])+ "\n")


                                    elif Nur_monat == "10":
                                        Okeinnahmen = (float(line_splitted[1])) + Okeinnahmen
                                        Okausgaben = (float(line_splitted[2])) + Okausgaben
                                        OkSaldo = Okeinnahmen - Okausgaben

                                        if zählermo10 == 0:
                                            with open(pfad_zu+Wer+"_mo_10_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa: 
                                                fa.write("Datum;Eingang;Ausgang;Text;Beleg-Nr.\n")
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")

                                            zählermo10 = zählermo10 + 1

                                        else:

                                            with open(pfad_zu+Wer+"_mo_10_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa:
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")


                                    elif Nur_monat == "11":
                                        Noeinnahmen = (float(line_splitted[1])) + Noeinnahmen
                                        Noausgaben = (float(line_splitted[2])) + Noausgaben
                                        NoSaldo = Noeinnahmen - Noausgaben

                                        if zählermo11 == 0:
                                            with open(pfad_zu+Wer+"_mo_11_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa: 
                                                fa.write("Datum;Eingang;Ausgang;Text;Beleg-Nr.\n")
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")

                                            zählermo11 = zählermo11 + 1

                                        else:

                                            with open(pfad_zu+Wer+"_mo_11_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa:
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")


                                    elif Nur_monat == "12":
                                        Deeinnahmen = (float(line_splitted[1])) + Deeinnahmen
                                        Deausgaben = (float(line_splitted[2])) + Deausgaben
                                        DeSaldo = Deeinnahmen - Deausgaben

                                        if zählermo12 == 0:
                                            with open(pfad_zu+Wer+"_mo_12_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa: 
                                                fa.write("Datum;Eingang;Ausgang;Text;Beleg-Nr.\n")
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")

                                            zählermo12 = zählermo12 + 1

                                        else:

                                            with open(pfad_zu+Wer+"_mo_12_zusammenstellung_"+Nur_Jahr+".kbu", "a") as fa:
                                                fa.write((line_splitted[0]) + ";"
                                                         + (line_splitted[1])+";"
                                                         +(line_splitted[2]) + ";"
                                                         + (line_splitted[3])+";"
                                                         + (line_splitted[4])+ "\n")

                Januareinnahmen = (number_format(Januareinnahmen))
                Januarausgaben = (number_format(Januarausgaben))
                JanuarSaldo = (number_format(JanuarSaldo))

                Febeinnahmen = (number_format(Febeinnahmen))
                Febausgaben = (number_format(Febausgaben))
                FebSaldo = (number_format(FebSaldo))

                Mareinnahmen = (number_format(Mareinnahmen))
                Marausgaben = (number_format(Marausgaben))
                MarSaldo = (number_format(MarSaldo))

                Apeinnahmen = (number_format(Apeinnahmen))
                Apausgaben = (number_format(Apausgaben))
                ApSaldo = (number_format(ApSaldo))

                Maieinnahmen = (number_format(Maieinnahmen))
                Maiausgaben = (number_format(Maiausgaben))
                MaiSaldo = (number_format(MaiSaldo))

                Juneinnahmen = (number_format(Juneinnahmen))
                Junausgaben = (number_format(Junausgaben))
                JunSaldo = (number_format(JunSaldo))


                Jueinnahmen = (number_format(Jueinnahmen))
                Juausgaben = (number_format(Juausgaben))
                JuSaldo = (number_format(JuSaldo))

                Aueinnahmen = (number_format(Aueinnahmen))
                Auausgaben = (number_format(Auausgaben))
                AuSaldo = (number_format(AuSaldo))

                Seeinnahmen = (number_format(Seeinnahmen))
                Seausgaben = (number_format(Seausgaben))
                SeSaldo = (number_format(SeSaldo))

                Okeinnahmen = (number_format(Okeinnahmen))
                Okausgaben = (number_format(Okausgaben))
                OkSaldo = (number_format(OkSaldo))

                Noeinnahmen = (number_format(Noeinnahmen))
                Noausgaben = (number_format(Noausgaben))
                NoSaldo = (number_format(NoSaldo))

                Deeinnahmen = (number_format(Deeinnahmen))
                Deausgaben = (number_format(Deausgaben))
                DeSaldo = (number_format(DeSaldo))

                # In Datei schreiben
                with open(pfad+Wer+"_Kassabuch_Monat_"+Nur_Jahr+".kbu", "w", newline="", encoding="utf-8") as f:
                    writer = csv.writer(f, delimiter=",")
                    writer.writerow(["Monat","Einnahmen", "Ausgaben", "Saldo"]) 
                    writer.writerow(["Januar",Januareinnahmen,Januarausgaben, JanuarSaldo]) 
                    writer.writerow(["Februar",Febeinnahmen,Febausgaben, FebSaldo]) 
                    writer.writerow(["März",Mareinnahmen,Marausgaben, MarSaldo]) 
                    writer.writerow(["April",Apeinnahmen,Apausgaben, ApSaldo]) 
                    writer.writerow(["Mai",Maieinnahmen,Maiausgaben, MaiSaldo]) 
                    writer.writerow(["Juni",Juneinnahmen,Junausgaben, JunSaldo]) 
                    writer.writerow(["Juli",Jueinnahmen,Juausgaben, JuSaldo]) 
                    writer.writerow(["August",Aueinnahmen,Auausgaben, AuSaldo]) 
                    writer.writerow(["September",Seeinnahmen,Seausgaben, SeSaldo]) 
                    writer.writerow(["Oktober",Okeinnahmen,Okausgaben, OkSaldo]) 
                    writer.writerow(["November",Noeinnahmen,Noausgaben, NoSaldo]) 
                    writer.writerow(["Dezember",Deeinnahmen,Deausgaben, DeSaldo]) 

            monatszusammenfassung()
# ---------------------- Ende Auslagern ---------------------------------------------------------  
         
# ------------ HauptFenster erstellen --------------------------------------------    
    
              
        self.title("Kassabuch")
        self.attributes("-topmost", True)
        menuleiste = tk.Menu(self)
        
        datei_menu = tk.Menu(menuleiste, tearoff=0)
        
        datei_Auswerten = tk.Menu(menuleiste, tearoff=0)
        datei_Auswerten.add_command(label="Monatliche zusammenstellung", command=Monatzu)#
        
        menuleiste.add_cascade(label="Auswerten", menu=datei_Auswerten)

        self.config(menu=menuleiste)

class EingabeFrame(ttk.Frame): 

    def __init__(self, container):
        super().__init__(container)
            
      # ----------  Frame erstellen ---------------
        self.welche = tk.StringVar()
        self.betrag = tk.StringVar()
        self.beleg = tk.StringVar()

                # Label für Auswahl Buchhaltung
        self.Datum_label = ttk.Label(self, text="Datum: ")
        self.Datum_label.grid(column=0, row=0,  sticky="W", pady="10", padx="5")
         
        #Heutiges Datum anzeigen
        self.kalender = DateEntry(self,width=5, font="Arial 10",selectmode='day',background='#ebe12c', foreground='#000000', borderwidth=1) 

        self.kalender.grid(row=0, column=1,padx='5', pady='2',sticky='ew')
            
        # Label für Auswahl Buchhaltung
        self.we_name_label = ttk.Label(self, text="Welches Kassabuch?")
        self.we_name_label.grid(column=0, row=1,  sticky="W", pady="2", padx="5")
        
        # Einlesen was für Buchhaltungen vorhanden sind
        buchhaltung=["Lohn","Haushalt","Haus","Mietwohnung"]
                
        # Combox für Welche Buchaltung
        self.welche_combox = ttk.Combobox(self, width=20, state="readonly")
        self.welche_combox['values'] = buchhaltung
        self.welche_combox.current(0)
        self.welche_combox.grid(column=1, row=1,  sticky="W", pady="2", padx="5")
         

def main():
    fenster = HauptFenster()
    fenster.mainloop()

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

Von den 500-Zeilen bleiben vielleicht 50 übrig, wenn Du nicht alles 12mal für jeden Monat kopierst, sondern passende Datenstrukturen und Schleifen benutzt.
Innerhalb von Methoden definiert man keine anderen Funktionen oder gar Klassen. Das muß alles auf die oberste Ebene verschoben werden.
Dann mußt Du, wie schon oben geschrieben, den GUI-Code sauber von der Programmlogik trennen.
Im ganzen Programm darf es nur ein Tk-Objekt geben und nur einen Aufruf von mainloop. Tief verschachtelt habe ich noch andere gesehen, die es aber nicht geben darf.
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Ok Danke, werde es versuchen
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Habe eine Lösung gefunden

Code: Alles auswählen

import tkinter as tk
from tkinter import Button, Tk, Label

def ausführen():
    #hier wird die Variable überrgeben
    import versuch
    versuch.variable = "Variable übergeben"
    versuch.start()

fenster = Tk()
                 
fenster.geometry('100x100')

label = tk.Label(fenster, text=" ")

schaltf1 = tk.Button(fenster, text="Variable übergeben",command=ausführen)

schaltf1.grid(row=0, column=0,sticky='w')

fenster.mainloop() 
Die versuch.py Datei

Code: Alles auswählen

import tkinter as tk
from tkinter import Button, Tk,Label

def start():

    fenster_2 = Tk()

    fenster_2.geometry('170x100')
    fenster_2.attributes("-topmost", True)

    label = tk.Label(fenster_2, text=variable)

    label = tk.Label(fenster_2, text=variable)# variable von Fenster 1
    label.grid(row=3, column=0)


    fenster_2.mainloop()
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe es schonmal gesagt, und ich sag's nochmal: man darf nur *einmal* mainloop aufrufen. Sonst ist das kein korrektes Programm. Und was du da machst ist wirklich schlimm. Du setzt eine globale Variable, und das auch noch vollkommen unnoetigerweise. Warum uebergibst du variable nicht einfach an start? Schon hast du schlechten globalen Zustand vermieden, und auch klar kommuniziert, was start als Eingabe erwartet.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich hatte Dir doch schon geschrieben, dass es im gesamten Programm nur ein Exemplar von Tk geben darf und idealerweise auch nur einen Aufruf von mainloop. Das gilt auch dann, wenn man das auf mehrere Module aufteilt.

Importe sollten immer am Anfang der Datei stehen, nicht mitten in einer Funktion. Globale Variablen darf man nicht benutzen, erst recht darf man keine neuen globalen Variablen innerhalb eines Moduls erzeugen. Das gibt völlig undurchsichtigen Code, der nicht wartbar oder testbar ist.

Ich habe Dir doch schon die Lösung gezeigt. Was passt daran nicht?
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Danke für Eure Geduld.
Ich denke so sollte es richtig sein.
Aber wie kann ich jetzt das Neue Fenster von der py Datei her starten ohne mainloop?
Ich möchte die Berechnung nicht im HauptCode machen.

Werner

Code: Alles auswählen

import tkinter as tk
from tkinter import Button, Tk, Label
import versuch

def ausführen():
   
    variable_1 = 1
    variable_2 = 2
    variable_3 = 3
    variable_4 = 4
    
    versuch.start(variable_1,variable_2,variable_3,variable_4,tk,Tk,Label)

fenster = Tk()
                 
fenster.geometry('100x100')

label = tk.Label(fenster, text=" ")

schaltf1 = tk.Button(fenster, text="Variable übergeben",command=ausführen)

schaltf1.grid(row=0, column=0,sticky='w')

fenster.mainloop() 
Die py Datei:

Code: Alles auswählen

def start(variable_1,variable_2,variable_3,variable_4,tk,Tk,Label):

    fenster_2 = Tk()

    fenster_2.geometry('170x100')
    fenster_2.attributes("-topmost", True)
    
    ergebnis = (variable_1+variable_2+variable_3)*variable_4
    
    label = tk.Label(fenster_2, text=str(ergebnis))
    label.grid(row=3, column=0)

    fenster_2.mainloop()
#Sirius3
Ich habe versucht Deinen Code so umzubauen, dass er mit einer py Datei zu startet. Bin jedoch zu keinem Ergebnis gekommen.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@WvonRiedi: Ich glaube dass es nur ein `Tk`-Objekt geben darf und man weitere Fenster mit `Toplevel` erstellt, wurde schon gesagt. Ich wollte die Lösung aber trotzdem noch mal wiederholen.

Und das mit der zweiten `mainloop()` → die Zweite einfach weg lassen. Eine reicht.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten