Problem bei Darstellung von informationen...

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
JanInfoHD
User
Beiträge: 16
Registriert: Montag 17. August 2015, 17:48

Hallo Liebe Community,
Ich habe da ein Programm geschrieben, das mit einer grafischen Oberfläche von tkinter funktioniert:
Es ist so zu sagen eine To-Do Liste, nach einen Klick auf den Button "task_create" öffnet sich ein weiteres kleineres Fenster in das man die Aufgabe reinschreiben muss, danach wird diese in eine Textdatei geschrieben: Iem Falle n mein wäre der name "Aufgabe Nr.21" (Die Nummer der Aufgabe wird mit einem lastId Generator erzeugt: bei ausführung der Funktion wird die Zahl in einer lastID.txt um einen addiert und in einer Variable gespeichert) In die .txt-Datei werden dann drei Zeilen beschrieben:

aufgabe = <Die Variable von der Eingabe der Aufgabe>
nr = <Die Variable aus der lastId.txt>
erledigt = false

Ich habe dazu ein zweites Haupt-Fenster erstellt, darin soll die Aufgabennummer, die Aufgabe undn eine Checkbox sein, wenn diese angeklickt wird, soll die Aufgabe verschwinden. Das zweite Problem were nun auch, das mehrere Aufgaben hintereinander gespeichert werden sollen ?!?

Die kronkrete Frage wäre also: Wie schaffe ich es, das oben genannte in einem einzigen Fenster von tkinter anzeigen zu lassen

MfG JanInfoHD
P.S Ich bin ein Anfänger, deswegen nicht wundern :-D
Zuletzt geändert von JanInfoHD am Freitag 11. September 2015, 21:52, insgesamt 3-mal geändert.
BlackJack

@JanInfoHD: Ich vermisse da irgendwie eine konkrete Frage‽
JanInfoHD
User
Beiträge: 16
Registriert: Montag 17. August 2015, 17:48

@BlackJack ich habes oben nochmal ergänzt :D
BlackJack

@JanInfoHD: Ich würde da ja mit der Programmlogik, ohne die GUI anfangen. Aber ich glaube das hatten wir schon mal. Also eine Klasse für ein einzelnes Todo und eine um Todos zu verwalten. So ein Todo bräuchte dann neben den drei Werten wohl noch ein Flag das aussagt ob das Todo neu ist bzw. verändert wurde, damit man weiss ob man es speichern muss oder nicht. Zumindest wenn man tatsächlich jedes Todo in einer eigenen Datei speichern möchte.

Anstelle der drei Zeilen würde ich ein Standardformat nehmen, wie beispielsweise CSV oder JSON. Für beides gibt es in der Standardbibliothek Module. Und mit beidem könnte man auch alle Todos in *einer* Datei speichern.
JanInfoHD
User
Beiträge: 16
Registriert: Montag 17. August 2015, 17:48

@BlackJack Mag ja sein, das Problem liegt aber bei der Darstellung der Aufgaben ;), in einem Konter Fenster sollen dann alle Aufgaben angezeigt werden: Es soll ein Fenster sein wo alle Aufgaben aufeglistet werden ?!? Wie mache ich das ? Ich könnte das ganze glaube ich über eine for Schleife machen: für das anzeigen einer Aufgabe in der Range von der letzten lastID soll eine Aufgabe angezeigt werden, und in die Nächte Zeile gesprungen werden. Ich weis nur nicht so ganz wie ich das machen soll, weil dann ja für jede Aufgabe ein neues Label erstellt werden müsste :(
BlackJack

@JanInfoHD: Bevor man etwas anzeigen kann muss man doch erst einmal wissen wie die Daten die dort angezeigt werden sollen als Datentypen modelliert wurden.

Ich würde eine Klasse für die Anzeige aller Todos schreiben die von `Tkinter.Frame` abgeleitet ist. Und eine, ebenfalls von `Frame` abgeleitet, die ein einzelnes Todo in einem Frame darstellt. Also die gleiche Aufteilung die ich schon für die Geschäftslogik vorgeschlagen hatte und die zu diesem Zeitpunkt schon implementiert sein sollte! Also müsstest Du Quelltext zeigen können von dem *was* da angezeigt werden soll.

Also wenn man Beispielsweise `Todo`-Objekte hätte mit `title`- und `is_done`-Attributen und einer `toggle_done()`-Methode, die in einem Containerobjekt stecken das iterierbar ist, dann könnte man das beispielsweise so schreiben:

Code: Alles auswählen

class TodoUI(tk.Frame):

    def __init__(self, parent, todo):
        tk.Frame.__init__(self, parent, relief=tk.RAISED, borderwidth=1)
        self.todo = todo
        self.done_var = tk.IntVar()
        tk.Checkbutton(
            self, command=self.toggle_done, variable=self.done_var
        ).pack(side=tk.LEFT)
        tk.Label(self, text=todo.title).pack(side=tk.LEFT)
        self.update()

    def update(self):
        self.done_var.set(int(self.todo.is_done))

    def toggle_done(self):
        self.todo.toggle_done()
        self.update()


class TodosUI(tk.Frame):

    def __init__(self, master, todos):
        tk.Frame.__init__(self, master)
        self.todos = todos
        self.todo_uis = list()
        self.update()

    def update(self):
        for todo_ui in self.todo_uis:
            todo_ui.destroy()
        for todo in self.todos:
            todo_ui = TodoUI(self, todo)
            todo_ui.pack(side=tk.TOP, fill=tk.X)
            self.todo_uis.append(todo)
JanInfoHD
User
Beiträge: 16
Registriert: Montag 17. August 2015, 17:48

Entschuldigen Sie, Ich bin noch ziemlicher Anfänger könnten sie mir vieleicht erklären was der Quelltext bedeutet :(
Wenn ich jetzt in einer Variable a1 bis a10 die Aufgaben gespeichert habe, wie lasse ich das anzeigen :D ?
@BlackJack
BlackJack

@JanInfoHD: So macht man das gar nicht. Wenn man anfängt Namen von 0 bis irgendwas durchzunummerieren, dann macht man etwas falsch. So etwas gehört in eine Datenstruktur. Oft eine Liste.

Was genau ist an dem Quelltext denn unklar? Objektorientierte Programmierung sollte man IMHO drauf haben *bevor* man sich an GUI-Programmierung wagt und die Geschäftslogik sollte stehen bevor man eine GUI da drauf setzt. Du fängst das von der falschen Seite an. Bevor Du Dir über die grafische Darstellung von Informationen Gedanken machst, müssen die Informationen ja programmintern erst einmal ordentlich als Objekte repräsentiert werden.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@JanInfoHD: Vielleicht noch als Hinweis: Wie siezen uns hier nicht, sondern duzen uns für gewöhnlich. Und das ist völlig unabhängig von dem möglicherweise hohen Altersunterschied zwischen dir und manchen anderen Usern. Falls es dir unangenehm ist, dann bleib gerne bei dem Sie. Aber wie gesagt: Ich wüsste hier niemanden, der ernsthaft erwartet, hier im Python-Forum gesiezt zu werden. ;)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

snafu hat geschrieben:Aber wie gesagt: Ich wüsste hier niemanden, der ernsthaft erwartet, hier im Python-Forum gesiezt zu werden. ;)
OT: Ich wusste, dass ich alt werde als ich vor einigen Jahren mal auf einem Motörhead-Konzert gesiezt wurde ("Haben Sie mal Feuer?"). Und nein, ich war definitiv nicht mit Anzug und Krawatte da. *seufz*
Antworten