Создание изображения вспышки в Python - PullRequest
1 голос
/ 23 апреля 2019

Я пытаюсь прошить изображение с помощью pack () и pack_forget ().

Мы создаем специальный BMW, а огни работают на Raspberry Pi.У меня есть мигалки, работающие с использованием gpiozero, но теперь мне нужно показать это на дисплее на приборной панели.Я могу скрыть и показать изображение с помощью Label.pack_forget () и Label.pack () соответственно в функции, но не могу заставить его мигать.Я пробовал следующий код.

Это работает:

def showBG():
    background_label.pack()

def hideBG():
    background_label.pack_forget()

hideBttn = tk.Button(window, text="Hide Arrow", command = hideBG)
showBttn = tk.Button(window, text="Show Arrow", command = showBG)

Это не так:

import tkinter as tk
from time import sleep

def flashBG():
    for i in range(0, 3):
        background_label.pack()
        sleep(.7)
        background_label.pack_forget()
        sleep(.3)  

showHideBttn = tk.Button(window, text = "Flash Arrow", command = flashBG)     

Первый пример показывает и скрывает стрелку, как и ожидалось: НажмитеНажмите кнопку «Скрыть», и она исчезнет, ​​нажмите кнопку «Показать», и она появится.

Второй пример должен мигать 3 раза, как мигалка в вашем автомобиле на приборной панели.Ожидание ВКЛ. 0,7 сек., ВЫКЛ. Ожидание .3 сек. X3 ...

Нет ошибок, я нажимаю кнопку Показать Скрыть, и стрелка просто исчезает, когда цикл for завершается.

Ответы [ 2 ]

3 голосов
/ 24 апреля 2019

Не следует использовать pack() и pack_forget() для симуляции мигания, поскольку метка не может быть помещена в одно и то же место, если в одном контейнере находится более одного виджета.

Также, используя sleep() блокирует mainloop() от обработки ожидающих событий, что приводит к тому, что background_label не обновляется.

Вы должны изменить основной цвет метки, чтобы имитировать мигание:

Сначала сохранитецвета переднего плана и фона надписи после ее создания:

flash_colors = (background_label.cget('bg'), background_label.cget('fg'))
# then flash_colors[0] is label background color
# and flash_colors[1] is label foreground color

Затем измените flashBG(), как показано ниже:

def flashBG(count=0, color_idx=0):
    # set label text color to background color (color_idx=0) to hide the label
    # or to foreground color (color_idx=1) to show the label
    background_label.config(fg=flash_colors[color_idx])
    if count < 5:
        # execute flashBG() again after 300ms or 700ms based on the color of the label
        window.after(300 if color_idx==0 else 700, flashBG, count+1, 1-color_idx)

flashBG(...) будет выполнено 6 раз (ВЫКЛ. 3 раза), ВКЛ 3 раза).

1 голос
/ 23 апреля 2019

см. Как сделать мигающее текстовое поле в tkinter?

Цикл for будет выполнен полностью до того, как будет произведен эффект в виджете tkinter. Поскольку последнее, что он делает, это pack_forget (), ничего не появляется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...