LernApp - Fragen und Antworten als dictionary aus CSV einlesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
makcode
User
Beiträge: 13
Registriert: Sonntag 27. Juni 2021, 16:37

Vielen Dank schon mal für die schnelle Antwort.
__deets__ hat geschrieben: Sonntag 23. Januar 2022, 15:57 Du kannst dein bestehendes Programm nicht benutzen. Zum einen, weil es so geschrieben ist, dass es direkt beim import laeuft.
Diesen Teil verstehe ich glaube ich. Die Konsequenz ist dann wahrscheinlich, dass die main.py überflüssig ist und ich die Logik, die darin steckt, auf die view.py und quiz.py Dateien aufteilen muss, sodass der view "losläuft" und sich die Werte aus der quiz.py holt, wenn sie benötigt werden.
__deets__ hat geschrieben: Sonntag 23. Januar 2022, 15:57 Zum anderen, weil es nicht dem GUI-Paradigma von Ereignissen, auf die reagiert wird, entspricht.
Zuerst konnte ich hiermit gar nichts anfangen. Mittlerweile dämmert es. Das ist der Ort an dem das Objekt gespeichert wird. Wenn du sagst, das entspricht nicht dem GUI-Paradigma, heißt das ich kann mit einem Label(*, text=variable) überhaupt nicht auf den String zugreifen oder greife ich einfach "falsch" darauf zu?
__deets__ hat geschrieben: Sonntag 23. Januar 2022, 15:57 Wenn du deinen Ablauf so wie beschrieben machen willst, dann bietet sich dafuer eine Reihe von tk.Frame-Objekten uebereinander an, von denen man das aktive mit tkraise() in den Fordergrund hebt. Ausserdem eine Zustandsvariable, die festlegt, wo im Ablauf man sich gerade befindet, und die dann durch entsprechende Ereignisse wie zB einem Knopf in der Namenseingabe veraendert wird. Aber nur, wenn da auch ein Name vergeben wurde!
Hier zu habe ich bereits ein Vorlage gefunden.

Code: Alles auswählen

import tkinter as tk
class Page(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)

    def show(self):
        self.lift()
         

class Page1(Page):
    def __init__(self, *args, **kwargs,):
        Page.__init__(self, *args, **kwargs)
        label = tk.Label(self, text="This is page 1")
        label.pack(side="top", fill="both", expand=True)

class Page2(Page):
    def __init__(self, *args, **kwargs):
        Page.__init__(self, *args, **kwargs)
        label = tk.Label(self, text="This is page 2")
        label.pack(side="top", fill="both", expand=True)

class Page3(Page):
    def __init__(self, *args, **kwargs):
        Page.__init__(self, *args, **kwargs)
        label = tk.Label(self, text="This is page 3")
        label.pack(side="top", fill="both", expand=True)

class Page4(Page):
    def __init__(self, *args, **kwargs):
        Page.__init__(self, *args, **kwargs)
        label = tk.Label(self, text="This is page 4")
        label.pack(side="top", fill="both", expand=True)


class MainView(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        p1 = Page1(self)
        p2 = Page2(self)
        p3 = Page3(self)
        p4 = Page4(self)


        buttonframe = tk.Frame(self)
        container = tk.Frame(self)
        buttonframe.pack(side="top", fill="x", expand=False)
        container.pack(side="top", fill="both", expand=True)

        p1.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
        p2.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
        p3.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
        p4.place(in_=container, x=0, y=0, relwidth=1, relheight=1)

        b1 = tk.Button(buttonframe, text="Page 1", command=p1.show)
        b2 = tk.Button(buttonframe, text="Page 2", command=p2.show)
        b3 = tk.Button(buttonframe, text="Page 3", command=p3.show)
        b4 = tk.Button(buttonframe, text="Page 4", command=p4.show)

        b1.pack(side="left")
        b2.pack(side="left")
        b3.pack(side="left")
        b4.pack(side="left")

        p1.show()


def main():
    root = tk.Tk()
    root.title("Title")
    main = MainView(root)
    main.pack(side="top", fill="both", expand=True)
    root.wm_geometry("400x400")
    root.mainloop()

if __name__ == '__main__':
    main()
Damit wollte ich mich beschäftigen, wenn ich den ersten Teil hinbekommen habe. Ich habe oft beim Lernen von Python den Hang zu schnell zu viel zu wollen, daher versuche ich mittlerweile eher kleinere Schritte zu gehen. Für deinen Input diesbezüglich bin ich dir sehr dankbar, weil mir nicht bewusst war, dass das Frames sind, die statt nebeneinander, übereinander liegen. Jetzt verstehe ich was da passiert.
__deets__ hat geschrieben: Sonntag 23. Januar 2022, 15:57 Was die Strings angeht - wieso sollten die anders sein, als schon bei dir im jetzigen Programm?
Vll habe ich hier wieder einen Denkfehler, aber bisher sind diese Strings nicht gespeichert, sondern werden anhand der print-Funktion Zeile für Zeile ausgegeben. Wenn ich die über ein Label ausgeben möchte, dann muss ich die doch zuerst in einer Variablen speichern, oder nicht? Auf diese Weise könnte ich doch auch ein Label anlegen, welches später auf mehrere Variablen bzw. Strings zugreift. Die print-Funktion würde dann in der Programmlogik entfallen.
makcode
User
Beiträge: 13
Registriert: Sonntag 27. Juni 2021, 16:37

__deets__ hat geschrieben: Sonntag 23. Januar 2022, 15:57 Zum anderen, weil es nicht dem GUI-Paradigma von Ereignissen, auf die reagiert wird, entspricht.
Okay, das Problem habe ich schon mal gelöst. :)

Code: Alles auswählen

class Player:
    def __init__(self, name):
        # self.name = input("Hello friend! Whats your name?:")
        # print("Hello", self.name)
        self.name = name
        print("Hello", self.name)
    def __str__(self):
        return self.name

Code: Alles auswählen

from tkinter import *
import main

class Application(Frame):
    def __init__(self, master=None, labeltext=""):
        Frame.__init__(self, master)
        self.lb = Label(master, text=labeltext)
        self.lb.pack()

root = Tk()
root.geometry("400x400")
app = Application(master=root, labeltext=main.player)
app.mainloop()
Mit der Methode

Code: Alles auswählen

def __str__(self):
kann man einen String zurückgeben, der im Label angezeigt wird.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist zwar richtig, das du da was gefunden hast. Aber das hat nichts mit dem was ich gesagt habe zu tun. Und ist auch eine eher nebensaechliche Erkenntnis in Bezug auf dein Problem - du wirst dadurch *nicht* ein update deines Textes erreichen.

Das Paradigma, von dem ich spreche, ist etwas anderes: GUIs basieren auf Ereignissen. Benutzereingaben, Timer, andere IO-Ereignisse. Man hat als Programmierer keinen Kontrolle mehr ueber den Programmfluss, sondern gibt den an eine Hauptschleife - mainloop - ab. Und dann wird man nur noch zurueckgerufen, wenn etwas passiert. Also zB dein Benutzer den "Weiter"-Knopf nach der Namenseingabe gedrueckt hat. Da entscheidet man dann, was passiert. Und sobald das passiert ist, laeuft wieder die Hauptschleife, und updated die GUI wie gewuenscht.
makcode
User
Beiträge: 13
Registriert: Sonntag 27. Juni 2021, 16:37

Vom Grundsatz her verstehe ich das. Meist hängt es an der Fähigkeit dies umzusetzen. Es fängt damit an, dass ich gar nicht wirklich weiß bzw. wusste wie ich das Programm aufteile und welche Dateien mit welchen interagieren. Ich dachte ein erster Schritt wäre einfach mal zu probieren, wie man einen oder mehrere Werte in der GUI angezeigt bekommt.

Diese Woche habe ich ein gutes Tutorial für eine Quiz-App mit GUI gefunden - https://www.freecodecamp.org/news/how-t ... trivia-db/. Das Tutorial habe ich heute gemacht und sogar das meiste verstanden. Nächstes Wochenende werde ich mal versuchen den Code nach meinen Vorstellung umzuschreiben. Ich hoffe, dass mir das weiterhilft. So habe ich wenigstens eine Vorlage mit einer funktionierenden GUI und ein Beispiel, wie man die Dateien und Klassen organisiert.

Es ist schon traurig, wie schwer ich mich damit tue und wie langsam ich vorankomme, trotzdem bin ich noch nicht an dem Punkt angekommen, dass ich aufgebe.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du dich wirklich erst seit einigen Wochen damit beschaeftigst, dann ist das schon ok, dass es noch nicht sitzt. Fuer so etwas braucht es schon ein bisschen Auseinandersetzung.
Antworten