Задать вопрос
Lord_of_Rings
@Lord_of_Rings
Северный странник. Злой, но добрый

Как получить цвет приложения на котором находится моё приложение?

Написал на PyQt5 часы AlwaysOnTop. У них отключен фон, меню, заголовок, кнопки. Т. е. все выглядит вот так:
скриншот
673cf2b882d89809349008.png
.
И у меня вопрос. Как узнать цвет фона окна на котором расположено мое приложение? Ну для контрастности, чтобы, на черном фоне цвет текста был белым, на другом - другой. Можно ли это как-то реализовать? Может быть через win32api?
  • Вопрос задан
  • 75 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
@dim5x
ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
Код:
spoiler
import sys
from PyQt5 import QtWidgets, QtCore, QtGui


class ClockWidget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        # Устанавливаем параметры окна
        self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.FramelessWindowHint)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)

        # Устанавливаем таймер для обновления времени
        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.update_time)
        self.timer.start(1000)  # Обновляем каждую секунду

        # Создаем метку для отображения времени
        self.label = QtWidgets.QLabel(self)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setStyleSheet("font-size: 48px;")  # Размер шрифта

        # Устанавливаем начальное время
        self.update_time()

        # Устанавливаем размер окна
        self.resize(200, 60)

        # Переменные для перемещения окна
        self.dragging = False
        self.drag_position = None

    def update_time(self):
        current_time = QtCore.QTime.currentTime()
        self.label.setText(current_time.toString("HH:mm:ss"))
        self.check_color_below_widget()

    def check_color_below_widget(self):
        # Получаем глобальные координаты нижней границы виджета
        global_pos = self.mapToGlobal(self.rect().bottomLeft())

        # Определяем координаты точки на 10 пикселей ниже
        point_below = global_pos + QtCore.QPoint(0, 10)

        # Получаем цвет пикселя в этой точке
        screen = QtWidgets.QApplication.primaryScreen()
        pixel_color = screen.grabWindow(0).toImage().pixel(point_below.x(), point_below.y())
        color = QtGui.QColor(pixel_color)

        # Выводим значения RGB для отладки
        print(f"Color below widget: R={color.red()}, G={color.green()}, B={color.blue()}")

        # Вычисляем яркость цвета
        brightness = (color.red() * 299 + color.green() * 587 + color.blue() * 114) / 1000

        # Устанавливаем цвет текста в зависимости от яркости
        if brightness < 128:  # Темный фон
            self.label.setStyleSheet("color: white; font-size: 48px;")
        else:  # Светлый фон
            self.label.setStyleSheet("color: black; font-size: 48px;")

    def paintEvent(self, event):
        # Рисуем прозрачный фон
        painter = QtGui.QPainter(self)
        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        painter.setBrush(QtGui.QColor(0, 0, 0, 0))

    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            self.dragging = True
            self.drag_position = event.globalPos() - self.frameGeometry().topLeft()

    def mouseMoveEvent(self, event):
        if self.dragging:
            self.move(event.globalPos() - self.drag_position)

    def mouseReleaseEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            self.dragging = False


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    clock = ClockWidget()
    clock.show()
    sys.exit(app.exec_())


673d462f556b5211575721.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы