在Python中显示没有窗口的透明PNG图像

问题描述

操作系统: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,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,"AdvancedSplash Test")

imagePath = "Images/05.png"
bitmap = wx.Bitmap(imagePath)

splash = AS.AdvancedSplash(frame,bitmap=bitmap)

app.MainLoop()

但它仍然填充透明区域

解决方法

您可能想查看 wx.lib.agw.advancedsplash 中 AdvancedSplash 的实现。它有点像一个初始屏幕,可以根据您使用的图片自行调整,如果您有透明胶片,它们会被考虑在内。

,

透明应用于框架,所以不要担心面板,整个东西都变得透明了。

enter image description here

小心你如何运行这段代码,因为它需要被杀死或 Ctrl-C'd。

import wx

class MyFrame(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,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",highlightthickness=0)
canvas.pack()

tk_img = tk.PhotoImage(file="cards.png")
canvas.create_image(0,image=tk_img,anchor="nw")

root.mainloop()

它会在屏幕上创建一个像这样的图像:

enter image description here

它将窗口的透明颜色更改为 "blue"(因为我使用的图片中没有任何蓝色的东西)并将背景颜色设置为 "blue"。这使窗口透明。为了显示图像,我使用了 tk.Canvas,但它可能适用于 tk.Label(尚未测试)。

请注意,这很可能仅适用于 Windows。