Entries aus Toplevel auslesen und verarbeiten

Fragen zu Tkinter.
Antworten
El_Furachier
User
Beiträge: 5
Registriert: Mittwoch 19. Juni 2019, 08:21

Hallo,

ich habe eine GUI erstellt, mit der ich in einem neuen Toplevel()-Fenster Entry Matrizen erzeuge.
Im Start Fenster werden die Reihen und Spalten der Matrize über Entry Einträge gewählt. Über einen Button wird das nächste Fenster geöffnet, welches eine Matrix mit Entries beinhaltet. Ich möchte nun diese Entry- Einträge auslesen und weiterverarbeiten.

Durch die Iteration wird eine 'list' aus den Entry Einträgen erzeugt.

Die Funktion .get() funktioniert beim Typ 'list' nicht. Wie kann ich einzelne Werte auslesen und weiterverabreiten? Diese müssen übrigens als Float verarbeitet werden.

Vielen Dank für die Hilfe!

Code: Alles auswählen

from tkinter import *


def buttongeneratenet():
    global entries 
    # Messpunkte in und quer zur Förderrichtung einlesen   
    pointnum_longit = list(range(int(entry_pointnum_longit.get()))) # in Förderrichtung
    pointnum_cross = list(range(int(entry_pointnum_cross.get()))) # quer zur Förderrichtung
    
    # Erzeugung eines TopLevelfensters
    widgetgeneratenet_longit = Toplevel()
    widgetgeneratenet_longit.title("Netzgenerierung")
    widgetgeneratenet_longit.configure(bg='white')
    label_widgetgeneratenet_longit = Label(widgetgeneratenet_longit, text='Positionen der Messpunkte in Richtung 1',bg='white')
    label_widgetgeneratenet_longit.grid(row= 0, column = 0,columnspan=4)
    
    entries = []
    # Erzeugung der Matrix für Abstände in Förderrichtung
    for i in pointnum_longit: 
        for j in pointnum_cross:
            label_knot_longit = Label(widgetgeneratenet_longit, text=str(i+1),bg='white')
            label_knot_longit.grid(row= 1, column = i+1, padx=10)
            entry_knot_longit = Entry(widgetgeneratenet_longit, bg='white')
            entry_knot_longit.grid(row=j+2, column=i+1,padx=10, pady=10)
    entries.append(entry_knot_longit)

    # Button zur Generierung eines Netzes
    buttongeneratenet_cross = Button(master=widgetgeneratenet_longit, text='Weiter',bg='white')
    buttongeneratenet_cross.grid(row = j+3, column = i+1,padx=10, pady=10, sticky=E)
 

# Erzeugung des Fensters
widget = Tk()
widget.configure(bg='white')
widget.geometry('260x180')
widget.resizable(width=True, height=True)

# Anzahl der Messpunkte
label_numpoints = Label(master=widget, text='Anzahl der Messpunkte',font=('Arial',10),anchor=W, bg='white')
label_numpoints.place(x=20, y=20)

# Anzahl der Messpunkte in Richtung 1
label_pointnum_longit = Label(master=widget, text='Richtung 1',font=('Arial',10),anchor=W, bg='white')
label_pointnum_longit.place(x=20, y=60)
entry_pointnum_longit = Entry(master=widget, bg='white')
entry_pointnum_longit.place(x=200, y=60, width=40, height=27)

# Anzahl der Messpunkte in Richtung 2
label_pointnum_cross = Label(master=widget, text='Richtung 2',font=('Arial',10),anchor=W, bg='white')
label_pointnum_cross.place(x=20, y=100)
entry_pointnum_cross = Entry(master=widget, bg='white')
entry_pointnum_cross.place(x=200, y=100, width=40, height=27)

# Button zur Generierung eines Netzes
button_generatenet = Button(master=widget, text='Generierung des Netzes', command=buttongeneratenet, bg ='white')
button_generatenet.place(x=20, y=140, width=220, height=27)

# Aktivierung des Fensters
widget.mainloop()
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine *-Importe, weil damit nicht mehr nachvollziehbar ist, woher welcher Name kommt.
Benutze kein `place`, weil das je nach System und Bildschirmauflösung zu unbenutzbaren GUIs führen kann.
Benutze kein `global`.
Du erzeugst viele Labels, die Du übereinenderklebst. Du speicherst nur den letzten Entry in Deiner Entries-Liste.
Warum wandelst Du die range-Objekte in eine Liste um?
Wie bei allen Listen: wenn Du mit den Elementen einer Liste etwas machen willst, brauchst du eine for-Schleife.
El_Furachier
User
Beiträge: 5
Registriert: Mittwoch 19. Juni 2019, 08:21

Hallo Sirius,
danke für deine Antwort. Ich werde deine Hinweise berücksichtigen. Wenn ich 'global' nicht nutze, bekomme ich die Fehlermeldung: NameError: name 'entries_longit' is not defined.
Wie kann ich diese Fehlermeldung vermeiden?

Grüße
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@El_Furachier: Bei jeder nicht-trivialen GUI kommt man um objektorientierte Programmierung (OOP) nicht herum. Damit löst man dann, dass man Zustand über Methodenaufrufe hinweg verwalten muss.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

da du dir jetzt vielleicht die Frage stellst, was OOP ist und wie du das lernen kannst:

https://docs.python.org/3/tutorial/

Wenn du dir mit dem englischen Text noch sehr schwer tust, kannst du für die Grundlagen dieses Tutorial verwenden:
https://py-tutorial-de.readthedocs.io/de/python-3.3/
Oder besser gesagt als Übersetzungshilfe, denn Python 3.9 ist aktuell.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten