Automatisierter label überschreiber ohne Button

Fragen zu Tkinter.
Antworten
Stoney27
User
Beiträge: 3
Registriert: Sonntag 19. April 2020, 16:55

Hallo.
Wie kann ich dieses Programm so automatisieren, dass immer nach einem gewissen Zeitabstand sich der Label Text ändert.
ich habe das schon mit sämtlichen wegen probiert, aber es hat nicht geklappt
Bisheriger Code:
from tkinter import *
import os
def buttonAbbruchClick():
abbruch.config() ((steht nur da, damit es keine Fehlermeldung gibt))
#os.system("shutdown /s /t 1")

def counter():
x= 3000
while x != 0:
x = x -1
if x<3001 and x>2000: ((in range (x,y) hat auch nicht funktioniert))
label_1.pack()
label_1['text']='Extrahiere Daten auf den Computer 9%'
if x<2001 and x>1000:
label_1.pack()
label_1['text']='Extrahiere Daten auf den Computer 9%'


tkFenster = Tk()
tkFenster.title('KEIN Virus')
tkFenster.geometry('400x125')
#frameaslot,yo
frameslot = Frame(master=tkFenster, bg='lightgrey')
frameslot.place(x=0, y=0, width=400, height=125)

label_1=Label(master=tkFenster,
text=' ',fg='black',
bg='lightgrey',
font=('Arial',12))
label_1.place(x=50,y=30,width=300,height=20)


buttonslot = Button(master=frameslot,
text='Abbrechen',fg='black',
bg='lightgrey',font=('Arial',8),
command=buttonAbbruchClick)
buttonslot.place(x=300, y=95, width=85, height=20)
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du suchst die Methode "after", die hier schon oft diskutiert worden ist. Einfach mal ein bisschen durch das tkinter Forum stoebern und sich inspirieren lassen.
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Stoney27: Sternchen-Importe sind Böse™. Da holt man sich gerade bei `tkinter` fast 200 Namen ins Modul von denen nur ein kleiner Bruchteil verwendet wird. Auch Namen die gar nicht in `tkinter` definiert werden, sondern ihrerseits von woanders importiert werden. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Funktionen und Methoden bekommen alles was sie ausser Konstanten benötigen als Argument(e) übergeben.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). Man nummeriert keine Namen. Man will dann entweder bessere Namen oder gar keine einzelnen Namen/Werte sondern eine Datenstruktur. Oft eine Liste.

Absolute Grössenvorgaben und `place()` sind keine gute Idee weil das nicht skaliert und nicht portierbar ist.

Wenn man irgendwo einen Ausdruck hinschreiben *muss* aber nicht wirklich etwas sinnvolles dort hinschreiben kann/will, dann gibt es dafür extra die ``pass``-Anweisung. Da muss man sich nicht irgendeinen unsinnigen Ausdruck ausdenken und kommentieren das der da nur steht weil da irgend etwas stehen muss.

`os.system()` sollte man nicht verwenden. Die Dokumentation verweist dort auf das `subprocess`-Modul.

Die ``while``-Schleife in `counter()` ist eigentlich eine ``for``-Schleife.

Statt der beiden Vergleiche mit ``and`` veknüpft wären verkettete Vergleiche wie man sie aus der Mathematik kennt verständlicher/leichter zu lesen.

Die Bedingungen von den beiden ``if``\s schliessen sich Gegenseitig aus, das zweite ``if`` sollte also ein ``elif`` sein. In beiden Fällen wird der gleiche Text in das Label gesetzt — entweder *das* macht keinen Sinn, oder das sollten keine zwei Bedingungen sein, denn die lassen sich auch leicht zu einer Bedingung zusammenfassen.

Der `pack()`-Aufruf macht dort keinen Sinn.

Am Ende fehlt der Aufruf der GUI-Hauptschleife damit das Programm überhaupt irgend etwas macht und sich nicht sofort wieder schliesst.

Zwischenstand:

Code: Alles auswählen

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


def on_button():
    pass
    # subprocess.run(["shutdown", "/s", "/t", "1"])


def count_down(label):
    for x in reversed(range(1, 3001)):
        #
        # TODO Entweder sind das keine zwei Bedingungen oder der Text für das
        #   Label sollte nicht der gleiche sein.
        #
        if 2000 < x < 3001:
            label["text"] = "Extrahiere Daten auf den Computer 9%"
        elif 1000 < x < 2001:
            label["text"] = "Extrahiere Daten auf den Computer 9%"


def main():
    fenster = tk.Tk()
    fenster.title("KEIN Virus")

    label = tk.Label(
        master=fenster,
        text="  ",
        fg="black",
        bg="lightgrey",
        font=("Arial", 12),
    )
    label.pack()

    tk.Button(
        master=fenster,
        text="Abbrechen",
        fg="black",
        bg="lightgrey",
        font=("Arial", 8),
        command=on_button,
    ).pack()
    
    fenster.mainloop()


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten