Seite 1 von 1

Reihenfolge

Verfasst: Donnerstag 12. Januar 2023, 23:39
von norgsmen
Hallo Community,

es geht um folgenden Code:

Code: Alles auswählen

import tkinter as tk
master = tk.Tk()
master.geometry("250x250")

button_list = {}
language = ["Python", "C", "C#"]

entry_lang = tk.Entry(master)
entry_lang.pack(pady=20)

def text_updation(language):
    entry_lang.delete(0, tk.END)
    entry_lang.insert(0, language)

for i in language:
    def action(x=i):
        return text_updation(x)
    button_list[i] = tk.Button(master, text=i, command=action)
    button_list[i].pack()

tk.mainloop()
um genau zu sein:

Code: Alles auswählen

def text_updation(language):
    entry_lang.delete(0, tk.END)
    entry_lang.insert(0, language)
Wenn ich nämlich entry_lang.delete nach unten und entry_lang.insert nach oben verschiebe, dann wird der Text auf dem Entry nicht mehr angezeigt. Aber spielt die Reihenfolge wirklich so eine große Rolle? Ich meine tk.mainloop() ist doch sowieso die ganze Zeit am Laufen und prüft, ob irgendwelche Benutzereingaben getätigt werden.

Danke!

Re: Reihenfolge

Verfasst: Freitag 13. Januar 2023, 06:06
von sparrow
Kannst du mal bitte erklären, was jede der beiden Zeilen macht? Dann sollte recht schnell klar werden, dass eine getauschte Reihenfolge nicht zielführend sein kann.

Und natürlich werden Anweisungen in einer Funktion immer sequntiell abgearbeitet. Bei GUI-Programmierung muss man nur davon ausgehen, dass diese eventbasiert aufgerufen werden.

Re: Reihenfolge

Verfasst: Freitag 13. Januar 2023, 08:48
von Sirius3
Funktionen werden nach Tätigkeiten benannt, "updation" ist aber keine Tätigkeit. Alles was eine Funktion braucht, muß sie über ihre Argumente bekommen, `entry_lang` kommt aber aus dem Nichts.
Man definiert keine Funktionen innerhalb von for-Schleifen. Statt dessen kannst Du in Deinem Fall functools.partial benutzen.
`i` ist der bescheuertste Name für eine `language`. Mit `i` assoziiert man immer einen Index. `button_list` ist gar keine Liste, deshalb sollte man in Variablennamen keine Datentypen schreiben, weil die im Zweifel falsch sind oder werden.

Code: Alles auswählen

import tkinter as tk
from functools import partial

LANGUAGES = ["Python", "C", "C#"]
 
def update_text(language_entry, language):
    language_entry.delete(0, tk.END)
    language_entry.insert(0, language)

def main():
    master = tk.Tk()
    language_entry = tk.Entry(master)
    language_entry.pack(pady=20)

    buttons = {}
    for language in LANGUAGES:
        button = tk.Button(master, text=language, command=partial(update_text, language_entry, language))
        button.pack()
        buttons[language] = button

    master.mainloop()

if __name__ == "__main__":
    main()

Re: Reihenfolge

Verfasst: Freitag 13. Januar 2023, 13:55
von norgsmen
@sparrow Die erste Zeile löscht was vom Entry und die zweite Zeile fügt etwas hinzu. Deshalb habe ich

Code: Alles auswählen

entry_lang.insert(0, language)
anfangs nach oben gepackt, weil wenn ich auf einen Button drücke soll, ja auch zuerst etwas hinzugefügt werden statt gelöscht. Irgendwie ist es noch nicht ganz einleuchtet mit der Reihenfolge.

Re: Reihenfolge

Verfasst: Freitag 13. Januar 2023, 14:04
von __deets__
Wenn ich dir sage "stell diese neuen Teller auf den Tisch", und danach sage "raeume *alle* Teller vom Tisch", wieviele Teller sind dann auf dem Tisch?

Re: Reihenfolge

Verfasst: Freitag 13. Januar 2023, 15:11
von norgsmen
@__deets__ Ja null haha, aber ich verstehe leider nicht wirklich den Zusammenhang mit der Funktion...

Re: Reihenfolge

Verfasst: Freitag 13. Januar 2023, 15:38
von Sirius3
Tisch = entry_lang
Teller = language
insert = stellen
delete = abräumen

Re: Reihenfolge

Verfasst: Freitag 13. Januar 2023, 17:52
von norgsmen
Irgendwo hat sich ein mieser Denkfehler eingeschlichen... Naja ich hätte jedenfalls noch eine andere Frage und zwar wenn ich

Code: Alles auswählen

button_list = {}
eine nornamle Liste zuweise [ ] dann bekomme ich diesen fehler: TypeError: list indices must be integers or slices, not str

Wie kann es aber sein das button_list {} die Werte: "Python", "C", "C#" speichern kann? Ist es nicht so, dass die Werte in einem Dictionary immer aus einem Schlüssel und einem Wert bestehen?

Re: Reihenfolge

Verfasst: Freitag 13. Januar 2023, 18:14
von sparrow
Zeig den Code, den du ausführst und die vollständige Fehlermeldung, die der Code wirft.
Erklärungen lassen zu viel Spielraum.

Re: Reihenfolge

Verfasst: Freitag 13. Januar 2023, 18:45
von __blackjack__
@norgsmen: Ja, die Elemente in einem Wörterbuch bestehen immer aus Schlüssel und Wert. Nur die Werte "Python", "C", und "C#" kann man neben einer Liste auch in einem `set()` speichern.

Re: Reihenfolge

Verfasst: Montag 16. Januar 2023, 15:45
von norgsmen
/erledigt
Danke für die ganzen Antworten