Bereits vorhandene Textdateien in einem Label Widget anzeigen

Fragen zu Tkinter.
Antworten
Benutzeravatar
Asteria
User
Beiträge: 4
Registriert: Donnerstag 23. Juni 2022, 14:20

Guten Tag!

Ich bin noch recht neu hier und habe auch noch nicht so viel Ahnung vom Programmieren. Ich bin gerade dabei, ein Programm zur Verwaltung von Vereinsmitgliedern und Vereinsinternen Dingen.
Dazu gehören auch feste Prüfungsprogramme, die ich gerne in Textdateien schreiben möchte.

Nun habe ich mir gedacht, ich möchte ein bestimmtes Prüfungsprogramm, also den Inhalt einer einzigen ganz bestimmten Textdatei, durch einen mit einem Command verbundenen Button in einem Label oder Textfeld neben dem Knopf ausgeben.
Ich habe allerdings absolut keinen Plan, wie das funktionieren kann und finde auch im Internet irgendwie nicht die passende Lösung zu meinem Problem.

Ich hoffe, jemand von euch kann mir helfen

Gruß
Asteria
With great Power comes great Responsibility.
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Asteria: Was genau ist denn das Problem? Man erstellt das Fenster, den Knopf, das Label, und was man sonst noch so braucht, und wenn der Knopf gedrückt wird, muss der Dateiinhalt gelesen werden und als Text auf dem Label gesetzt werden.

Nicht so viel Ahnung vom Programmieren und GUI-Programme ist immer so eine Sache, weil man für jede nicht-triviale GUI objektorientierte Programmierung (OOP) braucht, also eigene Klassen schreiben können muss. Das ist eher gegen Ende von Anfängertutorials Thema. Die Grundlagen von Funktionen und dann Klassen und Methoden sollte man am besten vor der GUI-Programmierung drauf haben, denn bei der GUI kommt dann noch ereignisbasierte Programmierung dazu, und das ist alles auf einmal schon ein ziemlicher Brocken für viele.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
Benutzeravatar
Asteria
User
Beiträge: 4
Registriert: Donnerstag 23. Juni 2022, 14:20

__blackjack__ hat geschrieben: Donnerstag 23. Juni 2022, 14:57 @Asteria: Was genau ist denn das Problem? Man erstellt das Fenster, den Knopf, das Label, und was man sonst noch so braucht, und wenn der Knopf gedrückt wird, muss der Dateiinhalt gelesen werden und als Text auf dem Label gesetzt werden.

Nicht so viel Ahnung vom Programmieren und GUI-Programme ist immer so eine Sache, weil man für jede nicht-triviale GUI objektorientierte Programmierung (OOP) braucht, also eigene Klassen schreiben können muss. Das ist eher gegen Ende von Anfängertutorials Thema. Die Grundlagen von Funktionen und dann Klassen und Methoden sollte man am besten vor der GUI-Programmierung drauf haben, denn bei der GUI kommt dann noch ereignisbasierte Programmierung dazu, und das ist alles auf einmal schon ein ziemlicher Brocken für viele.
Danke erstmal, für deine Antwort.
Mir ist bewusst, dass es eher ein Problem darstellt, direkt mit etwas so schwierigem anzufangen, trotzdem möchte ich das Programm aber gerne komplettieren und nutzbar machen.

Fenster, Label und Knopf bauen funktioniert super, hab ich auch schon oft in dem Programm getan. Was ich allerdings nicht hinkriege, ist, die Date auszulesen und den Inhalt dann im Label anzeigen zu lassen.
Könntest du, oder jemand anderes, ein kurzes Beispiel schreiben und ein paar Worte zu sagen?

Gruß
Asteria
With great Power comes great Responsibility.
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

Klar, hier ist der Code:

Code: Alles auswählen

label['text'] = special_file_path.read_text()
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

oder konventionell:

Code: Alles auswählen

import tkinter as tk
from pathlib import Path

class Gui():
    def __init__(self, datei_name):
        self.datei_name = datei_name
        self.label = tk.Label(root, width=20)
        self.label.pack(pady=5)
        tk.Button(root, text='Anzeigen', command=self.anzeige, bg='lightgreen',
                  width=20).pack(pady=5)
        
    def anzeige(self):        
        zu_zeigender_text = lese_datei(self.datei_name)
        self.label.config(text=zu_zeigender_text)               

def lese_datei(datei_name):
    with open(datei_name, 'r') as mein_file:
        lese_text = mein_file.read()
        return lese_text        

def schreibe_datei(datei_name): # Damit's auch was zum lesen gibt
    mein_text = 5 * 'Das ist ein Beispiel\n'
    with open(datei_name, 'w') as mein_file:
        schreibe = mein_file.write(mein_text)    

if __name__ == '__main__':
    datei_name = Path('mein_text_tile.txt')
    schreibe_datei(datei_name)    
    root = tk.Tk()    
    Gui(datei_name)
    root.mainloop()
Gruss Peter
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@peterpy: Man benutzt keine globalen Variablen. Das Hauptprogramm gehört in eine Funktion. Dann kann so etwas gar nicht erst passieren.

`Path` wird hier nicht mehr benutzt.

Man muss nicht jedes kleine Zwischenergebnis an einen Namen binden.

`mein_*` und `meine_*` sind als Vorsilben genau so sinnfrei wie `my_*`. Wessen sonst?

Mal abgesehen vom `mein_`, warum `mein_file` und nicht `meine_datei`? Denglish ist doof.

Beim Schreiben der Datei, was denkst Du was an den Namen `schreibe` gebunden wird? Der passt da nicht zu, und verwendet wird das dann auch nirgends.

`lese_text` ist ein schlechter Name für einen Text. Das klingt eher nach einem Funktions oder Methodennamen.

Bei Textdateien sollte man explizit die Kodierung angeben.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk

ENCODING = "ascii"


def schreibe_datei(dateiname):  # Damit's auch was zum lesen gibt
    with open(dateiname, "w", encoding=ENCODING) as datei:
        datei.write(5 * "Das ist ein Beispiel\n")


def lese_datei(dateiname):
    with open(dateiname, "r", encoding=ENCODING) as datei:
        return datei.read()


class Gui:
    def __init__(self, container_widget, dateiname):
        self.dateiname = dateiname
        self.label = tk.Label(container_widget, width=20)
        self.label.pack(pady=5)
        tk.Button(
            container_widget,
            text="Anzeigen",
            command=self.anzeigen,
            bg="lightgreen",
            width=20,
        ).pack(pady=5)

    def anzeigen(self):
        self.label.config(text=lese_datei(self.dateiname))


def main():
    dateiname = "test.txt"
    schreibe_datei(dateiname)
    root = tk.Tk()
    Gui(root, dateiname)
    root.mainloop()


if __name__ == "__main__":
    main()

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
Benutzeravatar
Dennis89
User
Beiträge: 1376
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

wobei es mit 'pathlib' doch wesentlich übersichtlicher wäre oder spricht etwas dagegen?

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk
from pathlib import Path

ENCODING = "ascii"
TEXT_DATEI_PFAD = Path(r"C:\irgendwo\inder\tiefe\test.txt")


class Gui:
    def __init__(self, container_widget, dateiname):
        self.dateiname = dateiname
        self.label = tk.Label(container_widget, width=20)
        self.label.pack(pady=5)
        tk.Button(
            container_widget,
            text="Anzeigen",
            command=self.anzeigen,
            bg="lightgreen",
            width=20,
        ).pack(pady=5)

    def anzeigen(self):
        self.label.config(text=self.dateiname.read_text(encoding=ENCODING))


def main():
    dateiname = Path(TEXT_DATEI_PFAD)
    dateiname.write_text(5 * "test\n", encoding=ENCODING)
    root = tk.Tk()
    Gui(root, dateiname)
    root.mainloop()


if __name__ == "__main__":
    main()
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten