Label blinken lassen

Fragen zu Tkinter.
Antworten
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

Guten Tag die Herren gibt es die möglichkeit in Tkinter ein Label mit bswp. dem Text "GO!" blinken zu lassen? 8)
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Was meinst du mit "blinken"? Mal kurz oder dauerhaft, wie blink in html?
Ich meine es geht beides nicht, aber man könnte es verschieden nachbauen.
Buttons kannst du mit "flash" kurz blinken lassen, dann noch command=None und relief ="flat", ...
Ansonsten was in der Art:

Code: Alles auswählen

#ungetestet
import Tkinter as tk
def blink(l, f1, f2):
    if l["bg"] == f1:
        l["bg"] = f2
    else:
        l["bg"] = f1
    l.after(200, blink, l, f1, f2)
l = tk.Label(text="GO!")
l.pack()
blink(l, "green", "red")
tk.mainloop()
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

hierfür ist doch eigentlich die Methode flash() gedacht...
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

SchneiderWeisse hat geschrieben:hierfür ist doch eigentlich die Methode flash() gedacht...
AttributeError: Label instance has no attribute 'flash'
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

ach, entschuldigung - hatte das Label irgendwie als Button gelesen...^^
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

Wie stoppe ich die Funktion wieder?

Code: Alles auswählen

import Tkinter as tk
def blink(l, f1, f2):
    if l["bg"] == f1:
        l["bg"] = f2
    else:
        l["bg"] = f1
    l.after(200, blink, l, f1, f2)
l = tk.Label(text="GO!")
l.pack()
blink(l, "green", "red")
tk.mainloop()

__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Indem du sie nicht wieder mit after anstösst.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

`after` liefert eine ID zurück, mit der man es canceln kann.
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

Hab es mal mit über Buttons probiert komme aber nicht zu Lösung, so das ich es mit einem Button Ein bzw. Ausschalten kann, das Ein funktioniert aber aus leider nicht..

Code: Alles auswählen

from tkinter import *
import tkinter as tk
import sys

master = Tk()
master.title("Störungen")
master.geometry("700x500")
master.configure(bg='black')

f1 = "orange"
f2 = "red"


def stop():
    l = False
    
def loop():

    def blink(l, f1, f2):
        if l["bg"] == f1:
            l["bg"] = f2
           
        else:
            l["bg"] = f1
        l.after(400, blink, l, f1, f2)
        l = True
        return

    blink(MyLabel1,"green", "red")

  
                
MyLabel1 = Label(master, bg="green",  text="OK")
MyLabel1.place(x=50,y=50, width=200,height=140)

Quit_button = Button(master, text="schließen", background='steelblue1', activebackground='steelblue3', command=master.destroy)
Quit_button.place(x = 25, y = 430, width=120, height=40)

Start_button = Button(master, text="Start", background='steelblue1', activebackground='steelblue3', command=loop)
Start_button.place(x = 225, y = 430, width=120, height=40)

Stop_button = Button(master, text="Stop", background='steelblue1', activebackground='steelblue3', command=stop)
Stop_button.place(x = 425, y = 430, width=120, height=40)


master.mainloop()
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nochmal: das etwas blinkt liegt daran, dass du die Funktion "blink" sich selbst durch after alle 400 ms aufrufen laesst. Wenn du moechtest, dass das aufhoert, darfst du das halt nicht machen. Aber natuerlich nicht gar nicht, dann blinkt ja nichts mehr. Wenn man etwas mal machen will, mal nicht, dann kann man das mit einer if-Abfrage entscheiden.

Und was dir auch auf die Fuesse fallen wird, sobald du das probierst ist, deine ganzen Namen mal sauber zu machen. l ist also ein label, das du umkonfigurierst, aber es soll auch gleichzeitig ein Wahrheitswert sein, der bestimmt, ob noch geblinkt wird oder nicht? Wie soll denn das deiner Meinung nach gehen?

Last but not least: du bist hier seit Monaten unterwegs, mit der Weiterentwicklung deines Projektes. Ganz zu Anfang hast du behauptet, du brauchst programmieren ja eigentlich gar nicht. Offensichtlich doch. Also - lern es.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Streifenhase1: wenn man Zustand hat (also Farbe, Blink-Status, etc), dann kommt man um eine Klasse nicht herum.

Code: Alles auswählen

import tkinter as tk
from itertools import cycle

class MainWindow(tk.Tk):
    COLORS = ["orange", "red"]

    def __init__(self):
        super().__init__()
        self.title("Störungen")
        self.colors = cycle(self.COLORS)
        self.blink_id = None
        self.blink_label = tk.Label(self, bg="green",  text="OK")
        self.blink_label.pack(fill=tk.X)
        tk.Button(self, text="schließen", background='steelblue1',
            activebackground='steelblue3', command=self.destroy).pack(fill=tk.X)
        tk.Button(self, text="Start", background='steelblue1',
            activebackground='steelblue3', command=self.blink).pack(fill=tk.X)
        tk.Button(self, text="Stop", background='steelblue1',
            activebackground='steelblue3', command=self.stop).pack(fill=tk.X)

    def stop(self):
        if self.blink_id:
            self.after_cancel(self.blink_id)
        self.blink_label["bg"] = "green"

    def blink(self):
        self.blink_label["bg"] = next(self.colors)
        self.blink_id = self.after(400, self.blink)

def main():
    master = MainWindow()
    master.mainloop()

if __name__ == '__main__':
    main()
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

@Sirius3
Danke!!!
paulposteo
User
Beiträge: 2
Registriert: Donnerstag 5. Dezember 2019, 14:58

@Sirius3
Diese Funktion hat ein großes Problem:

Code: Alles auswählen

    def blink(self):
        self.blink_label["bg"] = next(self.colors)
        self.blink_id = self.after(400, self.blink)
Eine rekursive Funktion ohne Abbruchbedingung? Das klingt nach (früh oder eher später): stack-overflow!
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

paulposteo hat geschrieben: Donnerstag 5. Dezember 2019, 15:01 Eine rekursive Funktion ohne Abbruchbedingung? Das klingt nach (früh oder eher später): stack-overflow!
Wo siehst du da bitte eine rekursive Funktion? Es wird einfach ein timer-callback registriert, da rekursiert nichts. Entsprechend auch keine Probleme mit dem Stack.
paulposteo
User
Beiträge: 2
Registriert: Donnerstag 5. Dezember 2019, 14:58

Ah, nur registrierung eines callback, und danach wird die Funktion beendet. Alles klar! Danke! 8)
Antworten