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

问题描述 投票:0回答:3

操作系统: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()

但它仍然填充透明区域

python user-interface wxpython
3个回答
0
投票

您可能想研究 wx.lib.agw.advancedsplash 中 AdvancedSplash 的实现。它有点像一个启动屏幕,可以适应您使用的图片,如果您有透明度,它们将被考虑在内。


0
投票

透明度应用于框架,所以不用担心面板,整个东西都变成透明的。

请小心运行此代码的方式,因为需要将其杀死或按 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()

0
投票

尝试这样的事情:

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。

© www.soinside.com 2019 - 2024. All rights reserved.