Отображение прозрачного изображения 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.

Другие вопросы по тегам