Отображение прозрачного изображения PNG без окна в Python
ОС: Windows 10
Python 3.8
Я пытаюсь отображать изображения PNG с прозрачностью без заголовка или любого другого указания информации об окне (представьте, что наклеиваете наклейку на экран). Я уже сделал это однажды на другом языке, поместив изображение в окно и удалив все элементы окна, включая заголовок и фон, но я не могу добиться этого на python.
Я уже пробовал Tkinter, но похоже, что он не предназначен для работы с прозрачностью PNG и не может иметь отдельную прозрачность для родительских и дочерних окон.
Сейчас пробую wxPython. Я считаю, что можно было бы сделать родительское окно прозрачным, а дочернее окно (которое содержит изображение) непрозрачным, но не могу понять, возможно ли это вообще.
Вот упрощенная версия моей попытки:
app = wx.App()
path = 'Images/02.png'
bitmap = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) # Create bitmap
frame = wx.Frame(None,-1,'Transparent Window',size=(1000,1000)) # Create frame (top level window)
frame.SetTransparent(100) # Change transparency of the frame
panel = wx.Panel(frame, -1) # Create panel (to hold the image)
wx.StaticBitmap(panel, -1, bitmap) # Put the image in the panel
panel.SetTransparent(255) # Change transparency of the panel (the image)
frame.Show()
app.MainLoop()
Но, к сожалению, ".SetTransparent()" работает только в окне верхнего уровня, поэтому я не могу установить прозрачность панели на что-либо еще.
Но в основном вопрос в том, можно ли с помощью Python отображать изображение с прозрачностью? Я не ищу какого-либо конкретного метода достижения этого, тот, который я предоставил, был единственным, что я знаю. Так что, пожалуйста, помогите мне, если сможете :)
Изменить 1: пытался использовать wx.lib.agw.advancedsplash:
import wx
import wx.lib.agw.advancedsplash as AS
app = wx.App()
frame = wx.Frame(None, -1, "AdvancedSplash Test")
imagePath = "Images/05.png"
bitmap = wx.Bitmap(imagePath)
splash = AS.AdvancedSplash(frame, bitmap=bitmap)
app.MainLoop()
Но он по-прежнему заполняет прозрачные области
3 ответа
Вы можете изучить реализацию AdvancedSplash в wx.lib.agw.advancedsplash. Это своего рода заставка, которая адаптируется к изображению, которое вы используете, и если у вас есть прозрачные пленки, они будут приняты во внимание.
К кадру применяется прозрачность, поэтому не беспокойтесь о панели, все становится прозрачным.
Будьте осторожны при запуске этого кода, так как его нужно убить или нажать Ctrl-C.
import wx
class MyFrame(wx.Frame):
def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, pos=(200,200), style=wx.FRAME_NO_TASKBAR)
panel1 = wx.Panel(self)
bitmap = wx.Bitmap('ace2.png', wx.BITMAP_TYPE_PNG)
image = wx.StaticBitmap(panel1, -1, bitmap)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(panel1)
self.SetSizerAndFit(sizer)
self.Show()
self.OnTransparent(None)
def OnTransparent(self, event):
self.SetTransparent(180)
self.Update()
app = wx.App()
frame = MyFrame(None, -1)
app.MainLoop()
Попробуйте что-то вроде этого:
import tkinter as tk
root = tk.Tk()
root.overrideredirect(True)
root.config(bg="blue", bd=0, highlightthickness=0)
root.attributes("-transparentcolor", "blue")
canvas = tk.Canvas(root, bg="blue", bd=0, highlightthickness=0)
canvas.pack()
tk_img = tk.PhotoImage(file="cards.png")
canvas.create_image(0, 0, image=tk_img, anchor="nw")
root.mainloop()
Он создает на экране такое изображение:
Он изменяет прозрачный цвет окна на (потому что на изображении, которое я использую, нет ничего синего) и устанавливает цвет фона на
"blue"
. Это делает окно прозрачным. Чтобы показать изображение, я использовал
tk.Canvas
но это может сработать с
tk.Label
(не тестировал).
Обратите внимание, что это, скорее всего, будет работать только в Windows.