Python. Рисовка изображений поверх окон

Ранее я обращался с вопросом: https://clck.ru/RXRDZ

Однако я так и понял как именно я могу отрисовывать изображения (image.jpg / image.gif), а не формы, такие как квадрат или круг. В интернете я нашёл способ с помощью PyQt5.QtWidgets.QLabel, однако он совсем не подходит, т.к. создаёт отдельное окно.

PyQt5.QtWidgets.QFrame подходит для этих целей? Если нет, то что стоит использовать?


Ответы (1 шт):

Автор решения: S. Nick

Как мне показалось, что вам надо что-то вроде заставки. Как вариант, одной из практический используемой реализации, предложу вам.

Обратите внимание! Класс QMovie - это вспомогательный класс для воспроизведения фильмов с помощью QImageReader. Больше... https://doc.qt.io/qt-5/qmovie.html

import sys
import threading
from PyQt5 import QtCore, QtWidgets, QtGui


def consuming_work(arg1, arg2):
    import time

    print(arg1, arg2)
    time.sleep(7)                               #  Какая-то трудоемкая задача
    print("finish")
    

class WorkerMessageBox(QtWidgets.QMessageBox):
    started  = QtCore.pyqtSignal()
    finished = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super().__init__(parent)
        self.finished.connect(self.accept)
        self.move(450, 420)

    def execute(self, func, args):
        threading.Thread(target=self._execute, args=(func, args,), daemon=True).start()
        return self.exec_()

    def _execute(self, func, args):
        self.started.emit()
        func(*args)                             #  Вызываем трудоемкую задачу  
        self.finished.emit()


class GifLabel(QtWidgets.QLabel):
    def __init__(self, *args, **kwargs):
        QtWidgets.QLabel.__init__(self, *args, **kwargs)

        self.setWindowFlags(
              QtCore.Qt.Window 
            | QtCore.Qt.Tool 
            | QtCore.Qt.FramelessWindowHint
            | QtCore.Qt.WindowStaysOnTopHint
            | QtCore.Qt.X11BypassWindowManagerHint)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)        
                                                   
        self.movie = QtGui.QMovie('D:/_Qt/__Qt/loading.gif')              # !!! .gif
        self.setMovie(self.movie)
        self.movie.start()


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    
    gifLabel = GifLabel()
    gifLabel.show() 

    msgBox = WorkerMessageBox()
    msgBox.setWindowTitle("Working ....")
    msgBox.setText("Работает, пожалуйста подождите ...")
    msgBox.setStandardButtons(QtWidgets.QMessageBox.NoButton)        
    
    msgBox.execute(consuming_work, ["Stack", "Overflow"])
    

    gifLabel.movie.stop()
    gifLabel.hide()

введите сюда описание изображения

→ Ссылка