Python. Рисовка изображений поверх окон
Ранее я обращался с вопросом: https://clck.ru/RXRDZ
Однако я так и понял как именно я могу отрисовывать изображения (image.jpg / image.gif), а не формы, такие как квадрат или круг. В интернете я нашёл способ с помощью PyQt5.QtWidgets.QLabel, однако он совсем не подходит, т.к. создаёт отдельное окно.
PyQt5.QtWidgets.QFrame подходит для этих целей? Если нет, то что стоит использовать?
Ответы (1 шт):
Как мне показалось, что вам надо что-то вроде заставки. Как вариант, одной из практический используемой реализации, предложу вам.
Обратите внимание! Класс 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()
