操作系统: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()
但它仍然填充透明区域
您可能想研究 wx.lib.agw.advancedsplash 中 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("-transparent","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"
(因为我正在使用的图片中没有任何蓝色的东西)并将背景颜色设置为"blue"
。这使得窗口透明。为了显示图像,我使用了 tk.Canvas
,但它可能与 tk.Label
一起使用(尚未测试)。
请注意,这很可能仅适用于 Windows。