Seite 1 von 1

Label blinken lassen

Verfasst: Mittwoch 5. Dezember 2007, 16:29
von sorgenlos
Guten Tag die Herren gibt es die möglichkeit in Tkinter ein Label mit bswp. dem Text "GO!" blinken zu lassen? 8)

Verfasst: Mittwoch 5. Dezember 2007, 17:25
von schlangenbeschwörer
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()

Verfasst: Mittwoch 5. Dezember 2007, 17:48
von nemomuk
hierfür ist doch eigentlich die Methode flash() gedacht...

Verfasst: Mittwoch 5. Dezember 2007, 18:06
von schlangenbeschwörer
SchneiderWeisse hat geschrieben:hierfür ist doch eigentlich die Methode flash() gedacht...
AttributeError: Label instance has no attribute 'flash'

Verfasst: Mittwoch 5. Dezember 2007, 18:18
von nemomuk
ach, entschuldigung - hatte das Label irgendwie als Button gelesen...^^

Re: Label blinken lassen

Verfasst: Freitag 26. Oktober 2018, 12:21
von Streifenhase1
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()


Re: Label blinken lassen

Verfasst: Freitag 26. Oktober 2018, 12:48
von __deets__
Indem du sie nicht wieder mit after anstösst.

Re: Label blinken lassen

Verfasst: Freitag 26. Oktober 2018, 13:25
von Sirius3
`after` liefert eine ID zurück, mit der man es canceln kann.

Re: Label blinken lassen

Verfasst: Samstag 3. November 2018, 12:05
von Streifenhase1
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()

Re: Label blinken lassen

Verfasst: Samstag 3. November 2018, 13:07
von __deets__
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.

Re: Label blinken lassen

Verfasst: Samstag 3. November 2018, 20:37
von Sirius3
@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()

Re: Label blinken lassen

Verfasst: Montag 5. November 2018, 15:58
von Streifenhase1
@Sirius3
Danke!!!

Re: Label blinken lassen

Verfasst: Donnerstag 5. Dezember 2019, 15:01
von paulposteo
@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!

Re: Label blinken lassen

Verfasst: Donnerstag 5. Dezember 2019, 15:12
von __deets__
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.

Re: Label blinken lassen

Verfasst: Donnerstag 5. Dezember 2019, 15:26
von paulposteo
Ah, nur registrierung eines callback, und danach wird die Funktion beendet. Alles klar! Danke! 8)