Tail logfile Button

Fragen zu Tkinter.
Antworten
mabosu2010
User
Beiträge: 6
Registriert: Mittwoch 27. Oktober 2021, 16:06

Hallo,

brauche mal eure hilfe bitte.

folgendes: tkinter problem.
ich möchte über meinen Button eine logfile in eine Text box anzeigen lassen.
Soweit passt es auch. Jetzt soll aber das ganze nachdem es die logfile eingelesen hat
ans ende des Textfelds springen und anschließend muss das ganze alle 10 sekunden automatisch
wiederholt werden bis ich wieder auf den button drücke.

so eine art Tail funktion nur etwas anders. Geht das überhaupt?
Momentan muss ich das Aktualisieren und ans ende Springen manuel tätigen. Was sehr mühsam
ist. Ich wäre um jede hilfe dankbar.


def logFile():
text.delete(0.0, 'end')
text_file = open("C:/py/txt.log", 'r')
stuff = text_file.read()

text.insert(END, stuff)
text_file.close()




log = Button(root, image=image10, bg="#143d63", command=logFile)
log.place(relx=0.50,
rely=0.04,
anchor='center')
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mabosu2010: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). Also `log_file()` statt `logFile()`. Wobei das auch ein schlechter Funktionsname ist, denn Funktions- und Methodennamen beschreiben üblicherweise die Tätigkeit die sie durchführen. `log_file` wäre dagegen ein passender Name für ein Dateiobjekt.

Du verwendest einmal 'end' als literale Zeichenkette und einmal `END` als Konstante für den gleichen Zweck. Das sollte beide male die Konstante sein.

Das Du die Konstante einfach so zur Verfügung hast, lässt befürchten, dass da ein Sternchen-Import im Spiel ist: Nicht machen.

Beim öffnen von Dateien sollte man die ``with``-Anweisung verwenden und eine konkrete Kodierung angeben. Wobei man mit `pathlib.Path` komplette Dateien auch ohne `open()`/`close()` beziehunsgweise ``with`` und `open()` einlesen kann.

`text` kommt aus dem Nichts. Alles was eine Funktion oder Methode ausser Konstanten benötigt, bekommt sie als Argument(e) übergeben.

`text` ist kein guter Name für ein Widget, weil man den dann nicht mehr für Text verwenden kann. Jedenfalls nicht parallel zum Widget.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Man nummeriert keine Namen. Dann will man entweder bessere Namen verwenden, oder gar keine Einzelwerte sondern eine Datenstruktur. Oft eine Liste.

`place()` ist keine gute Idee. Auch wenn relative Positionen besser sind als Absolute, ist das trotzdem nicht gut, weil auch so komische bis unbenutzbare GUIs entstehen können, wenn das nicht auf sehr ähnlichen Systemen mit vergleichbaren Systemeinstellungen läuft.

Code: Alles auswählen

import tkinter as tk
from functools import partial
from pathlib import Path


def display_logfile(text_widget):
    text_widget.delete(0.0, tk.END)
    text_widget.insert(
        tk.END, Path("C:/py/txt.log").read_text(encoding="utf-8")
    )


def main():
    ...
    display_logfile_button = tk.Button(
        root,
        image=log_image,
        bg="#143d63",
        command=partial(display_logfile, text_widget),
    )
    display_logfile_button.place(relx=0.5, rely=0.04, anchor=tk.CENTER)
Was Du jetzt suchst ist die `after()`-Methode auf Widgets.

Und früher oder später braucht man für jede nicht-triviale GUI objektorientierte Programmierung (OOP), also eigene Klasse(n).

``tail`` ist das übrigens nicht wirklich, wenn man die Datei immer wieder komplett einliest.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten