Seite 1 von 1

TK inter, zwei Funktionen mit Datenübertragung dazwischen

Verfasst: Mittwoch 24. Juni 2020, 11:26
von DIDI.DE
ich hänge seit längerem an einem Punkt und komm und komm nicht weiter:

mit tkinter muss ich auf zwei def zugreifen (zwei Button-Funktionen) und die Zahlenwerte in Form einer Liste von einer def auf die zweite def übertragen. Am besten wäre es, wenn die Liste aus der ersten def als txt-Datei gespeichert würde und dann in der zweiten def Datei wieder aus der txt-Datei hochgeladen werden könnte. Ich habe vieles probiert. Es funktioniert, wenn ich keine def einsetze. Das Einrücken bei der def ist das Problem. Ich muss aber def einsetzen und einrücken, wegen tkinter.

Ich wäre dankbar, wenn mir jemand über diese Hürde helfen könnte. Bitte um verständliche Hilfe: bin ein ein wenig fortgeschrittener Anfänger.

Code: Alles auswählen

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

import time

import numpy as np
from numpy import array

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

prio = [5, 6, 2]

def priorisieren_00():

    a00 = float (eingabefelda00.get()) 
    b00 = float (eingabefeldb00.get()) 
    c00 = float (eingabefeldc00.get()) 
    d00 = float (eingabefeldd00.get()) 
    e00 = float (eingabefelde00.get()) 

    if a00 < (e00 + d00):
        prio00 = 10
    elif a00 > (c00 + e00):
        prio00 = 9
    elif (a00 * b00) < (a00 * 50):
        prio00 = 8
    else:
        prio00 = 20

    ausgabeprio000.configure(text=str(prio00))

    prio[0] = prio00

    np.savetxt("test.txt", prio)

def priorisieren_01():

    prio01 = 20

    ausgabeprio001.configure(text=str(prio01))

    prio[1] = prio01

    np.savetxt("test.txt", prio, fmt="%8.2f")

def priorisieren_02():

    prio02 = 40

    ausgabeprio002.configure(text=str(prio02))

    prio[2] = prio02

    np.savetxt("test.txt", prio, fmt= "%8.2f")

def listen():

    prio = np.loadtxt("test.txt")
    
    listsummand = np.array([0.01, 0.02, 0.03])
    
    listsumme = (prio + listsummand)

    listsort = np.sort(-listsumme)
    
    listprio = (1 - (listsort % 1)) * 100

    priola1 = listprio[1]
    priola2 = listprio[2]
    priola3 = listprio[3]

    ausgabeprio003.configure(text=str(priola1))
    
    ausgabeprio004.configure(text=str(priola2))

    ausgabeprio005.configure(text=str(priola3))

fenster = tk.Tk()
fenster.title("Python-Programm")
fenster.config(bg="#87cefa")
fenster.geometry("2000x800")


eingabefelda00 = tk.Entry(fenster, bd=4, width=20)
eingabefelda00.insert(10, 10)
eingabefeldb00 = tk.Entry(fenster, bd=4, width=20)
eingabefeldb00.insert(10, 4)
eingabefeldc00 = tk.Entry(fenster, bd=4, width=20)
eingabefeldc00.insert(10, 3)
eingabefeldd00 = tk.Entry(fenster, bd=4, width=20)
eingabefeldd00.insert(10, 2)
eingabefelde00 = tk.Entry(fenster, bd=4, width=20)
eingabefelde00.insert(10, 1)


ausgabeprio000 = tk.Label(fenster, background = "#ffffff", font = ("Helvetica", 14, "bold"), text = " Priorität ")
ausgabeprio001 = tk.Label(fenster, background = "#ffffff", font = ("Helvetica", 11, "bold"), text = " Priorität ")
ausgabeprio002 = tk.Label(fenster, background = "#ffffff", font = ("Helvetica", 11, "bold"), text = " Priorität ")
ausgabeprio003 = tk.Label(fenster, background = "#ffffff", font = ("Helvetica", 11, "bold"), text = " Platz 1 ")
ausgabeprio004 = tk.Label(fenster, background = "#ffffff", font = ("Helvetica", 11, "bold"), text = " Platz 2 ")
ausgabeprio005 = tk.Label(fenster, background = "#ffffff", font = ("Helvetica", 11, "bold"), text = " Platz 3 ")

prio00 = tk.Button(fenster, background = "#306998", foreground = "#ffffff", borderwidth = 2, text=" prio0? ", command=priorisieren_00)
prio01 = tk.Button(fenster, background = "#306998", foreground = "#ffffff", borderwidth = 2, text=" prio1? ", command=priorisieren_01)
prio02 = tk.Button(fenster, background = "#306998", foreground = "#ffffff", borderwidth = 2, text=" prio2? ", command=priorisieren_02)

prioliste = tk.Button(fenster, background = "#306998", foreground = "#ffffff", borderwidth = 2, text=" prioliste? ", command=listen)

eingabefelda00.grid(row = 1, column = 1)
eingabefeldb00.grid(row = 2, column = 1)
eingabefeldc00.grid(row = 3, column = 1)
eingabefeldd00.grid(row = 4, column = 1)
eingabefelde00.grid(row = 5, column = 1)
prio00.grid(row = 6, column = 1)
ausgabeprio000.grid(row=6, column =2)

prio01.grid(row = 12, column = 1)
ausgabeprio001.grid(row=12, column =2)

prio02.grid(row = 18, column = 1)
ausgabeprio002.grid(row=18, column =2)

prioliste.grid(row = 19, column = 1)
ausgabeprio003.grid(row=20, column =1)
ausgabeprio004.grid(row=20, column =2)
ausgabeprio005.grid(row = 20, column = 3)



fenster.mainloop()

Re: TK inter, zwei Funktionen mit Datenübertragung dazwischen

Verfasst: Mittwoch 24. Juni 2020, 12:35
von peterpy
Hallo DIDI.DE
importiere:

Code: Alles auswählen

from functools import partial
anstelle von:
command=priorisieren_00

benutze partial:

Code: Alles auswählen

command=partial(priorisieren_00,  was,  immer,  Du,  mitgeben,  willst)
dann die Funktion:

Code: Alles auswählen

def priorisieren_00(was,  immer,  Du,  mitgeben,  willst):
    ......
    .....
Gruss
Peter

Re: TK inter, zwei Funktionen mit Datenübertragung dazwischen

Verfasst: Mittwoch 24. Juni 2020, 12:42
von Sirius3
Warum ist des "am besten", wenn man statt dessen auch alles im Speicher behalten könnte?
Ist es wichtig, dass die Liste persistiert wird?
Jedes nicht-triviale GUI-Programm braucht Klassendefinitionen, und es wird dann nicht-trivial, wenn man Zustand (Deine Liste) über das Ende eines Aufrufs hinaus braucht.
Dein Code ist ob der vielen Leerzeilen sehr schlecht lesbar. Durchnummerierte Funktionen sind fast noch schlimmer als durchnummerierte Variablen. Funktionen und Variablen sollten so benannt werden, dass man verstehen kann, wofür sie gebraucht werden.
Es sollte keine Globalen Variablen geben und alles was unter ´fenster = tk.Tk` steht, sollte auch in eine Funktion wandern.

Re: TK inter, zwei Funktionen mit Datenübertragung dazwischen

Verfasst: Donnerstag 25. Juni 2020, 10:56
von DIDI.DE
vielen herzlichen Dank, Peter

das ist die Lösung