Прозрачное окно в python

Есть ли способ создать прозрачные окна с Tkinter?

В конечном итоге я пытаюсь создать «окна странной формы» с помощью Python, используя модуль Tkinter. Но сейчас я позволю себе сделать фон прозрачным, сохраняя при этом дочерние виджеты полностью видимыми.

Я знаю, что это делается с помощью wxPython и некоторых других модулей, но я спрашиваю об ограничениях Tkinter.

Может ли Tkinter создать чистый Canvas или Frame? Можно ли упаковать элементы интерфейса без холста или рамки? Могут ли отдельные элементы интерфейса быть прозрачными?

Может ли он передавать места щелчка мышью обратно в систему для обработки любых окон под ней в стеке Z?

1 ответ

Опция root.attributes(‘-alpha’, 0.1) может быть использован для создания прозрачного окна

from Tkinter import * root = Tk() root.attributes('-alpha', 0.3) root.mainloop() 

Однако в этом случае даже виджеты в корне унаследуют прозрачность.

Обновление для Linux (протестировано в Ubuntu)

Приведенный выше код не работает на машинах Linux. Вот обновление, которое работает на Linux.

from tkinter import Tk # or(from Tkinter import Tk) on Python 2.x root = Tk() root.wait_visibility(root) root.wm_attributes('-alpha',0.3) root.mainloop() 

Не уверен, что это работает в Windows.

Итоги на конец 2019 г.:

Начиная с версии 8.6 TCL/TK, alpha , fullscreen а также topmost Атрибуты окна работают на ВСЕХ платформах (Windows, Mac и Linux):

В предыдущих версиях руководства было отмечено, что ПРЕДЫДУЩИЕ БЫЛИ различия платформ (только некоторые платформы поддерживали эти 3 атрибута). Но пока вы используете последнюю версию TCL/TK, вам гарантировано, что все эти атрибуты будут работать на ВСЕХ платформах!

В LINUX все еще есть причуды платформы, поскольку каждая функция атрибута окна зависит от базового оконного менеджера операционной системы (на Mac и Windows они всегда доступны, но в Linux есть множество различных оконных менеджеров / композиторов, и НЕ все поддерживают прозрачные окна и т. д.). В нем говорится, что если прозрачность не поддерживается, alpha собственность будет оставаться в 1.0 если вы попытаетесь прочитать его позже. Однако на странице также отмечается, что в Linux (X11) атрибуты обновляются асинхронно, что означает, что вы не можете доверять прочитанному значению (если вы измените альфа, а затем немедленно попытаетесь прочитать его, вы все равно прочитаете старое значение., поэтому вы не можете использовать этот метод, чтобы проверить, была ли альфа-версия успешно изменена в Linux).

Читайте также:  Трехмерный график функции питон

Что касается других ответов, в которых говорится, что вам сначала нужно использовать root.wait_visibility(root) в Linux, чтобы окно было видно на экране, прежде чем устанавливать alpha атрибут. Не знаю, так как у меня нет Linux-машины для проверки. Но я сильно сомневаюсь, что это нужно больше, поскольку официальное руководство говорит, что альфа поддерживается, и ничего не говорит о необходимости этой команды. В любом случае не помешает добавить wait_visibility Уловка тоже. Это просто команда, которая запускает очень короткий цикл обработки событий, ожидающий, пока на экране пользователя не появится фактическое окно. Так что, вероятно, все еще будет хорошей идеей добавить эту команду перед настройкой всех ваших атрибутов. Тем более, что доказано, что альфа- версия помогает работать с Linux на старых версиях TCL / TK! PS: Вам не нужен (root) аргумент и должен ввести root.wait_visibility() вместо этого, что означает «ждать self (в данном случае root, поскольку мы вызвали команду для корневого объекта)».

Обновить:

Даниэль в комментариях ниже сообщил мне, что root.wait_visibility() все еще необходимо в Ubuntu 19.10. Хотя он не указал свои версии Python, TCL/TK или TkInter, возможно, они устарели в его системе. В любом случае, похоже, безопаснее всегда включать эту команду для обратной совместимости!

Источник

Создание прозрачного окна для рисования поверх всех приложений

Недавно столкнулся с проблемой рисования поверх всех приложений чтобы при этом я мог продолжать в них работать, перерыв тучу сайтов нормального ответа толком и не нашел.

В данной статье мы рассмотрим, как создать прозрачное окно для рисования на языке Python, используя библиотеку PyQt5. Мы научимся создавать окно, настраивать его прозрачность и отображать его поверх всех окон на рабочем столе, сохраняя при этом функциональность и удобство использования для пользователей.

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

Читайте также:  Css body margin none

Шаг 2: Установка необходимых библиотек

Для создания прозрачного окна мы будем использовать библиотеку PyQt5, которая предоставляет мощные инструменты для создания графического интерфейса на основе Qt.

Для установки библиотек можно воспользоваться командой pip:

Шаг 3: Импорт необходимых модулей

После установки библиотек мы можем импортировать их в наш код:

import sys from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtGui import QPainter, QBrush, QColor, QPen from PyQt5.QtCore import Qt, QTimer, QRect import random 

Шаг 4: Определение класса DrawingWindow

Для создания прозрачного окна мы определяем класс DrawingWindow, который наследуется от класса QMainWindow. В конструкторе класса устанавливаются необходимые параметры окна, такие как заголовок, геометрия и флаги. Также инициализируется объект QPainter для рисования на окне.

class DrawingWindow(QMainWindow): def __init__(self, coordinates): super().__init__() # Устанавливаем заголовок окна self.setWindowTitle("Прозрачное окно для рисования") # Устанавливаем геометрию окна, чтобы оно занимало весь экран self.setGeometry(0, 0, QApplication.desktop().screenGeometry().width(), QApplication.desktop().screenGeometry().height()) # Устанавливаем флаги, чтобы окно было без рамки и оставалось поверх других окон self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowSt aysOnTopHint) # Создаем объект QPainter для рисования на окне self.painter = QPainter() self.painter.setRenderHint(QPainter.Antialiasing) # Устанавливаем начальный цвет пера (красный) и ширину пера (4 пикселя) self.pen_color = QColor(255, 0, 0) self.pen_width = 4 # Сохраняем переданные координаты прямоугольников для рисования self.coordinates = coordinates # Создаем таймер для обновления окна self.draw_timer = QTimer() # Запускаем таймер и устанавливаем интервал обновления окна (10 миллисекунд) self.draw_timer.start(10) 

Шаг 5: Обновление и отображение окна

В функции paintEvent происходит обновление окна при каждом событии paintEvent. Мы используем объект QPainter для рисования на окне. Сначала рисуется прозрачный фон, затем рисуются прямоугольники с использованием координат из переменной self.coordinates.

def paintEvent(self, event): self.painter.begin(self) # Устанавливаем прозрачный фон self.painter.setPen(Qt.NoPen) self.painter.setBrush(QBrush(Qt.transparent)) self.painter.drawRect(QRect(0, 0, self.width(), self.height())) # Устанавливаем цвет пера и его ширину self.painter.setPen(QPen(QColor(self.pen_color), self.pen_width)) self.painter.setBrush(QBrush(Qt.transparent)) # Рисуем прямоугольники, используя переданные координаты for coord in self.coordinates: x, y, width, height = coord self.painter.drawRect(x, y, width, height) self.painter.end() # Обновляем координаты self.update_coord() # Планируем перерисовку через 1 секунду QTimer.singleShot(1000, self.update) 

Шаг 6: Обновление координат

Координаты прямоугольников обновляются с помощью вызова метода update_coord(), который получает новые координаты с помощью функции R.run() из модуля ScreenCapture. Если новые координаты представлены в виде списка, то они сохраняются в переменную self.coordinates. В противном случае, новые координаты преобразуются в список и сохраняются.

def update_coord(self): self.coordinates = [(random.randrange(0, 1000), random.randrange(0, 1000), random.randrange(0, 1000)), (random.randrange(0, 1000), random.randrange(0, 1000), random.randrange(0, 1000))] 

Шаг 7: Запуск приложения

При запуске определяются начальные координаты прямоугольников s_coordinates. Затем создается экземпляр класса Recognizer и окно DrawingWindow с передачей координат s_coordinates. Затем окно отображается с помощью метода show().

if __name__ == "__main__": # Начальные координаты прямоугольников s_coordinates = [(524, 474, 84, 64), (524, 367, 84, 47)] app = QApplication(sys.argv) # Создаем экземпляр класса Recognizer # Создаем экземпляр класса DrawingWindow с передачей координат window = DrawingWindow(s_coordinates) # Отображаем окно window.show() # Запускаем цикл обработки событий приложения и выходим, когда цикл завершится sys.exit(app.exec_()) 

Теперь вы знаете, как создать прозрачное окно для рисования поверх всех приложений с использованием библиотеки PyQt5 на языке Python. Это может быть полезно при создании приложений или скриптов, которые требуют взаимодействия с пользователем без прерывания их работы. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их.

Читайте также:  Html web form textarea

Как видно четырехугольники прекрасно отображаются поверх Pycharm и при этом не мешают работать с ним. А вообще этот кейс является частью проекта за которым можно следить здесь

import sys from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtGui import QPainter, QBrush, QColor, QPen from PyQt5.QtCore import Qt, QTimer, QRect import random class DrawingWindow(QMainWindow): def __init__(self, coordinates): super().__init__() self.setWindowTitle("Transparent Drawing Window") self.setGeometry(0, 0, QApplication.desktop().screenGeometry().width(), QApplication.desktop().screenGeometry().height()) self.setAttribute(Qt.WA_TranslucentBackground, True) self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint) self.painter = QPainter() self.painter.setRenderHint(QPainter.Antialiasing) self.pen_color = QColor(255, 0, 0) # Set the initial pen color to red self.pen_width = 4 # Set the initial pen width to 4 self.coordinates = coordinates # Store the coordinates for drawing rectangles self.draw_timer = QTimer() self.draw_timer.start(10) # Update the window every 10 milliseconds def paintEvent(self, event): self.painter.begin(self) self.painter.setPen(Qt.NoPen) self.painter.setBrush(QBrush(Qt.transparent)) self.painter.drawRect(QRect(0, 0, self.width(), self.height())) # Draw a transparent background self.painter.setPen(QPen(QColor(self.pen_color), self.pen_width)) self.painter.setBrush(QBrush(Qt.transparent)) for coord in self.coordinates: x, y, width, height = coord self.painter.drawRect(x, y, width, height) # Draw rectangles using the provided coordinates self.painter.end() self.update_coord() # Update the coordinates QTimer.singleShot(1000, self.update) # Schedule a repaint after 1 second def update_coord(self, coords=0): if coords != 0: pass else: self.coordinates = [ (random.randrange(0, 500), random.randrange(0, 500), random.randrange(0, 500), random.randrange(0, 500))] if __name__ == "__main__": coordinates = [(524, 474, 818-524, 689-474), (524, 367, 818-524, 473-367)] app = QApplication(sys.argv) window = DrawingWindow(coordinates) # Create an instance of the DrawingWindow class with the given coordinates window.show() # Display the window sys.exit(app.exec_()) # Start the application event loop and exit when it's finished

Источник

Оцените статью