【问题标题】:Displaying a transparent PNG image without window in Python在Python中显示没有窗口的透明PNG图像
【发布时间】:2021-04-10 22:49:35
【问题描述】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的想法,我查看了 wx.lib.agw.advancedsplash 的文档。它清楚地表明它只会绘制考虑位图的透明度。但它仍然不起作用。这里是最简单的代码:import wx import wx.lib.agw.advancedsplash as AS app = wx.App() frame = wx.Frame(None, -1, "AdvancedSplash Test") imagePath = "test.png" bitmap = wx.Bitmap(imagePath) splash = AS.AdvancedSplash(frame, bitmap=bitmap) app.MainLoop() 但是splash还是画了透明区域:imgur.com/bzAFSJs不知道是不是漏了什么
    【解决方案2】:

    透明度是应用到框架上的,所以不用担心面板,整个东西都变得透明了。

    请注意如何运行此代码,因为它需要被终止或 Ctrl-C'd。

    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()
    

    【讨论】:

    • 我想我可能不小心把我的意图描述得不够清楚,抱歉。 PNG 格式具有 alpha 通道,表示图像中的透明区域。当图像显示在屏幕上时,我希望考虑到(图像中像素的)透明度。设置整个图像的透明度是我实际上试图避免的事情:) 尽管你的例子很有帮助,因为它教会了我使用样式来删除标题栏,而且 BoxSizer 看起来也很有趣,所以谢谢 :)跨度>
    【解决方案3】:

    试试这样的:

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 2020-10-29
      • 1970-01-01
      • 2014-05-08
      • 2013-02-18
      相关资源
      最近更新 更多