Integer bekommt kein signal von Tkinter Textbox

Fragen zu Tkinter.
Antworten
Maxus
User
Beiträge: 2
Registriert: Montag 21. März 2022, 08:19

Es gibt ein Problem mit dem Integerl bei der Funktion von change_array. Könnt ihr das überprüfen und mir helfen?
Und gibt es eine Möglichkeit, die Eingabefelder mit einer Schleife der Länge des Arrays zu programmieren? Dass ich nicht für alle Daten im Array ein neues Eingabefeld schreiben muss und es aufgrund der Länge des Arrays individuell ist.

Danke für Ihre Hilfe!

Code: Alles auswählen

from tkinter import*
arrays=Tk()
arrays.title = "Numbers"

numbers = [17, 103, 36, 42, 85, 3, 64, 98, 55, 11]



tbox1 = Entry(arrays, width=10)
tbox1.grid(row=2, column=1, ipady = 5)

tbox2 = Entry(arrays, width=10)
tbox2.grid(row=3, column=1, ipady = 5)

tbox3 = Entry(arrays, width=10)
tbox3.grid(row=4, column=1, ipady = 5)

tbox4 = Entry(arrays, width=10)
tbox4.grid(row=5, column=1, ipady = 5)

tbox5 = Entry(arrays, width=10)
tbox5.grid(row=6, column=1, ipady = 5)

tbox6 = Entry(arrays, width=10)
tbox6.grid(row=7, column=1, ipady = 5)

tbox7 = Entry(arrays, width=10)
tbox7.grid(row=8, column=1, ipady = 5)

tbox8 = Entry(arrays, width=10)
tbox8.grid(row=9, column=1, ipady = 5)

tbox9 = Entry(arrays, width=10)
tbox9.grid(row=10, column=1, ipady = 5)

tbox10 = Entry(arrays, width=10)
tbox10.grid(row=11, column=1, ipady = 5)


def change_array():
    numbers[0] = int(tbox1.get())
    numbers[1] = int(tbox2.get())
    numbers[2] = int(tbox3.get())
    numbers[3] = int(tbox4.get())
    numbers[4] = int(tbox5.get())
    numbers[5] = int(tbox6.get())
    numbers[6] = int(tbox7.get())
    numbers[7] = int(tbox8.get())
    numbers[8] = int(tbox9.get())
    numbers[-1] = int(tbox10.get())
    
    new_text = "The new array is"
    number_label1.config(new_text)
    number_label2.config(numbers)

submit = Button(arrays, text="Submit", width=10, bg = "lightgrey", command = change_array())
submit.grid(row=14, column=1)

 

arrays.mainloop() 
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Maxus: Sternchen-Importe sind Böse™. Da holt man sich gerade bei `tkinter` fast 140 Namen ins Modul von denen nur ein kleiner Bruchteil verwendet wird. Auch Namen die gar nicht in `tkinter` definiert werden, sondern ihrerseits von woanders importiert werden. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Damit sind dann auch globale Variablen hinfällig. Alles was eine Funktion oder Methode ausser Konstanten benötigt, bekommt sie als Argument(e) übergeben. Bei GUI-Programmen führt das nahezu zwangsläufig dazu, dass man objektorientierte Programmierung (OOP) braucht, also eigene Klassen schreiben muss.

Das was Du da hast ist kein Array sondern eine Liste. Es gibt auch Arrays, darum sollte man da mit den Begriffen sauber umgehen um Verwirrung zu vermeiden.

Es ist auch sehr unüblich Listenelemente über den Index zu verändern. Man würde da einfach eine neue Liste mit dem gewünschten Inhalt erstellen.

Namen nummeriert man nicht. Da will man entweder bessere Namen verwenden, oder gar keine einzelnen Namen, sondern die Werte in einer Datenstruktur speichern. Oft in einer Liste.

Womit wir dann auch bei der Frage mit einer dynamischen Anzahl von Eingabeelementen wären, und die Antwort lautet Schleifen und Listen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Das, was Du Arrays nennst, sind Listen. Wenn man anfängt Variablennamen durchzunummerieren, dann möchte man eigentlich eine passende Datenstruktur verwenden, z.B. eine Liste und Schleifen.
Man benutzt keine Abkürzungen, was ist denn eine tbox?

*-Importe sind böse, weil man unkontrolliert Namen in den eigenen Namensraum schaufelt.
Globale Variablen verwendet man nicht, alles was Funktionen brauchen, müssen sie über ihre Argumente bekommen, auf oberster Ebene werden keine Variablen definiert, diese Zeilen müssen in eine Funktion, die man üblicherweise main nennt, wandern.
`number_label1` und `number_label2` werden verwendet, aber nirgends definiert. Bei `config` fehlt, was denn eigentlich konfiguriert werden soll.
Das command-Argument von Button erwartet eine Funktion, nicht den Rückgabewert einer Funktion.

Code: Alles auswählen

from functools import partial
import tkinter as tk

def change_array(label, text_boxes):
    numbers = [int(box.get()) for box in text_boxes]
    label['text'] = f"The new array is {numbers}"

def main():
    numbers = [17, 103, 36, 42, 85, 3, 64, 98, 55, 11]

    arrays = tk.Tk()
    arrays.title = "Numbers"

    text_boxes = []
    for row, number in enumerate(numbers, 2):
        entry = tk.Entry(arrays, width=10)
        entry.insert(tk.END, number)
        entry.grid(row=row, column=1, ipady=5)
        text_boxes.append(entry)

    label = tk.Label(arrays)
    label.grid(row=1, column=2)
    submit = tk.Button(arrays, text="Submit", width=10, bg = "lightgrey", command=partial(change_array, label, text_boxes))
    submit.grid(row=14, column=1)
    arrays.mainloop() 

if __name__ == "__main__":
    main()
Antworten