TK inter, zwei Funktionen mit Datenübertragung dazwischen

Fragen zu Tkinter.
Antworten
DIDI.DE
User
Beiträge: 8
Registriert: Samstag 11. Januar 2020, 12:31

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()
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

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
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
DIDI.DE
User
Beiträge: 8
Registriert: Samstag 11. Januar 2020, 12:31

vielen herzlichen Dank, Peter

das ist die Lösung
Antworten