Как сделать прозрачное окно в python

Добавил пользователь Владимир З.
Обновлено: 18.09.2024

Многие программы на сегодняшний день используют графический интерфейс, который более интуитивен и удобен для пользователя, чем консоль. И с помощью языка программирования Python также можно создавать графические программы. Для этого в Python по умолчанию применяется специальный toolkit - набор компонентов, который называется tkinter .

Библиотека tkinter доступна в виде отдельного встроенного модуля, который содержит все необходимые графические компоненты - кнопки, текстовые поля и т.п.

Базовым моментом в построении графических программ является создание окна. Затем в окно добавляются все остальные компоненты графического интерфейса. Поэтому создадим вначале простейшее окно. Для этого определим следующий скрипт:

Для создания графического окна применяется конструктор Tk() , который определен в модуле tkinter . Создаваемое окно присваивается переменной root , и через эту переменную мы можем управлять атрибутами окна. Вместо комментария '''any code''' добавляются все необходимые компоненты окна.

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

В результате при запуске скрипта мы увидим такое пустое окошко:

C помощью метода title() можно установить заголовок окна.

По умолчанию окно позиционируется в верхний левый угол экрана. Но мы можем изменить его положение, передав нужные значения в метод geometry() :

Создайте 4 окна с заголовками окон: "Top", "Bottom", "Right", "Left". Разместить окна по сторонам рабочего стола:

  • вверх по центру,
  • низ по центру,
  • право по центру,
  • лево по центру.

Создайте 4 окна с заголовками окон: "Top-right", "Top-left", "Bottom-right", "Bottom-left". Разместить 4 окна по углам рабочего стола.

Создайте окно, появляющееся в центре экрана, с заголовком "Center".

Текстовые и другие редакторы в заголовках программы указывают имя "активного файла - название программы".

  • Создайте окно с заголовком в виде f-строки, в котором указывается имя разработчика, название и версия программы;
  • Имя и версия программы хранятся в отдельных переменных;
  • Пример вывода заголовка: "Bob's programm - Empty v.01"

Иконки окон не отображаются в системах MacOS, задача только для Windows: Найдите в интернете, как в tkinter сменить иконку, отображаемую в левом верхнем углу окна. И замените её, на любую другую иконку, которую можно скопировать из интернета или создать самому. Картинка для иконки обязательно должна иметь расширение .ico .

В этом уроке рассмотрим основные настройки окон, в которых располагаются виджеты. Обычные окна в Tkinter порождаются не только от класса Tk , но и Toplevel . От Tk принято создавать главное окно. Если создается многооконное приложение, то остальные окна создаются от Toplevel. Методы обоих классов схожи.

Размер и положение окна

По умолчанию окно приложения появляется в верхнем левом углу экрана. Его размер (ширина и высота) определяется совокупностью размеров расположенных в нем виджетов. В случае если окно пустое, то tkinter устанавливает его размер в 200 на 200 пикселей.

С помощью метода geometry можно изменить как размер окна, так и его положение. Метод принимает строку определенного формата.

Первые два числа в строке-аргументе geometry задают ширину и высоту окна. Вторая пара чисел обозначает смещение на экране по осям x и y . В примере окно размерностью 600 на 400 будет смещено от верхней левой точки экрана на 200 пикселей вправо и на 100 пикселей вниз.

Если перед обоими смещениями вместо плюса указывается минус, то расчет происходит от нижних правых углов экрана и окна. Так выражение root.geometry('600x400-0-0') заставит окно появиться в нижнем правом углу.

В аргументе метода geometry можно не указывать либо размер, либо смещение. Например, чтобы сместить окно, но не менять его размер, следует написать root.geometry('+200+100') .

Бывает удобно, чтобы окно появлялось в центре экрана. Методы winfo_screenwidth и winfo_screenheight возвращают количество пикселей экрана, на котором появляется окно. Рассмотрим, как поместить окно в центр, если размер окна известен:

Здесь мы вычитаем половину ширины и высоты окна (по 200 пикселей). Иначе в центре экрана окажется верхний левый угол окна, а не его середина.

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

Метод update_idletasks позволяет перезагрузить данные об окне после размещения на нем виджетов. Иначе geometry вернет строку, где ширина и высота равняются по одному пикселю. Видимо таковы параметры на момент запуска приложения.

По умолчанию пользователь может разворачивать окно на весь экран, а также изменять его размер, раздвигая границы. Эти возможности можно отключить с помощью метода resizable . Так root.resizable(False, False) запретит изменение размеров главного окна как по горизонтали, так и вертикали. Развернуть на весь экран его также будет невозможно, при этом соответствующая кнопка разворота исчезает.

Заголовок окна

По умолчанию с стоке заголовка окна находится надпись "tk". Для установки собственного названия используется метод title .

Если необходимо, заголовок окна можно вообще убрать. В программе ниже второе окно ( Toplevel ) открывается при клике на кнопку, оно не имеет заголовка, так как к нему был применен метод overrideredirect с аргументом True . Через пять секунд данное окно закрывается методом destroy .

Практическая работа

Напишите программу, в которой на главном окне находятся холст и кнопка "Добавить фигуру". Кнопка открывает второе окно, включающее четыре поля для ввода координат и две радиокнопки для выбора, рисовать ли на холсте прямоугольник или овал. Здесь же находится кнопка "Нарисовать", при клике на которую соответствующая фигура добавляется на холст, а второе окно закрывается. Проверку корректности ввода в поля можно опустить.

Курс с примерами решений практических работ: android-приложение, pdf-версия.

Андрей Бондарев

Миша Стогов, если GUI на PyQt/PySide, можно сделать очень просто:
window.setWindowFlags(Qt.WindowStaysOnTopHint)
window.setWindowOpacity(1 / 255)

Миша Стогов

Андрей, на 3,6 pyqt не устанавливаеться как его устанвоить ?через pip ругает,чисто на PySide будет работать?

Андрей Бондарев

Миша, pip install PySide —only-binary :all:
PyQt и PySide вроде как полностью или почти полностью взаимозаменяемы

Миша Стогов

Андрей, не пашет так )
pip install PySide токо пашет,видимо придёться установить версию питона 3,4 и ниже для pyside

Антон Алексеев


Антон Алексеев

Макс Шерстюк


Макс Шерстюк ответил Мише

Мне нужно сделать так, что бы я мог выводить только rectangle, при этом что бы всё остальное было полностью прозрачным - по настоящему прозрачным.

p.s На то как я получаю img не смотрите, это просто попытка сделать фон прозрачным.

sanya84

Как вариант

Немного не понимаю как я могу вставить свои переменные вместо чисел:
start_point = (5, 5)
end_point = (220, 220)
На:
start_point = (x, y)
end_point = (w, h)
Просто я даже не понимаю где какая функция вызывается, даже отловить не могу где мне передавать x,y,w,h

зачем тебе прозрачный фон, если ты можешь только данное изображение выводить?
proc_img= img[y:y+h, x:x+w]
P.S. можешь дополнить фон чем-то

5f3ebd6f7b19b271829386.jpg


Такс:
Фон все равно не прозрачный
Иногда этих прямоугольников может быть несколько, поэтому они накладываются друг на друга(как я понял)
Он не держит размер окна (допустим 100 на 100 пикселей) а делает его минимальным лишь бы поместился прямоугольник.
Мне нужно не обрезать изображение, а по хорошему выводить только прямоугольники, так как у меня есть фон, и он обрезается вместе с ним.
(Заранее прошу прощение что это не упомянул сразу)

Я делаю шахматную программу, и я хочу иметь возможность перетаскивать фигуры. Для этого я помещаю изображение куска на Canvas чтобы его можно было перетаскивать (я также могу использовать Label если хочу). Однако, когда я перетаскиваю кусок, вокруг изображения появляется белый квадрат.

enter image description here

Когда я исследовал проблему, многие люди дали такое решение:

Это делало фон прозрачным, но не шахматная доска была видна, это была программа за GUI

Можно ли как-нибудь сделать фон прозрачным и показать шахматную доску позади, а не программу за окном tkinter?

Примечание: я не против использования любого другого виджета (например, Label ), но они должны использовать модули, которые поставляются по умолчанию с Python (поэтому без PIL), так как эту программу необходимо использовать в среде, где я не могу загрузить другие модули.

Вопрос: Как сделать фон холста tkinter прозрачным?

Единственный возможный config(. опция config(. , чтобы установить фон в ничто

Читайте также: