Reihenfolge

Fragen zu Tkinter.
Antworten
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

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!
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

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

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()
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

@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.
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

@__deets__ Ja null haha, aber ich verstehe leider nicht wirklich den Zusammenhang mit der Funktion...
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Tisch = entry_lang
Teller = language
insert = stellen
delete = abräumen
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

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?
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Zeig den Code, den du ausführst und die vollständige Fehlermeldung, die der Code wirft.
Erklärungen lassen zu viel Spielraum.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

/erledigt
Danke für die ganzen Antworten
Antworten