wxpython:wxpython中的透明面板

时间:2015-04-29 11:02:22

标签: python python-2.7 wxpython

可以使用wxpython中的SetTransparent(val)使整个框架透明。但我可以在其中制作一个透明的面板吗?

我尝试使用panelobj.SetTransparent(val)但是没有用。

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title,size=(250, 250))

        topPanel = wx.Panel(self)

        panel1 = wx.Panel(topPanel, -1)
        panel1.SetTransparent(100)
        panel2 = wx.Panel(topPanel, -1)
        panel2.SetBackgroundColour('gray')

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(panel1,1,flag = wx.EXPAND|wx.ALL)
        sizer.Add(panel2,1,flag = wx.EXPAND|wx.ALL)

        topPanel.SetSizer(sizer)



class MyApp(wx.App):
     def OnInit(self):
         frame = MyFrame(None, -1, 'frame')
         frame.Show(True)
         return True

app = MyApp(0)
app.MainLoop()

假设我想为panel1设置透明度。

2 个答案:

答案 0 :(得分:3)

是的,这是可能的。您可以使用style=wx.TRANSPARENT_WINDOW

示例代码:我使panel1透明,并为topPanel提供了绿色。这就是为什么你在panel2之上看到绿色的原因,因为panel1是透明的。

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title,size=(250, 250))
        topPanel = wx.Panel(self, -1)
        topPanel.SetBackgroundColour('green')
        panel1 = wx.Panel(topPanel, -1, style=wx.TRANSPARENT_WINDOW)
        #panel1.SetTransparent(100)
        panel2 = wx.Panel(topPanel, -1)
        panel2.SetBackgroundColour('gray')

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(panel1,1,flag = wx.EXPAND|wx.ALL)
        sizer.Add(panel2,1,flag = wx.EXPAND|wx.ALL)

        topPanel.SetSizer(sizer)



class MyApp(wx.App):
     def OnInit(self):
         frame = MyFrame(None, -1, 'frame')
         frame.Show(True)
         return True

app = MyApp(0)
app.MainLoop()

答案 1 :(得分:3)

特定于平台的窗口可以并且可以变得透明。

CanSetTransparent方法允许您检查是否可以在运行时切换窗口的透明度。如果它返回false,SetTransparent将(通常)不执行任何操作,并且您不应该调用它。

脱离我的头顶(但不要引用我的话 - 它必须在某处记录,但我无法找到它......):

  • 使用Cocoa构建的Mac OS X:任何东西都可以透明。
  • 带有碳构建的Mac OS X(没有人再使用):只有顶级窗口才能透明。
  • Windows:只有顶级窗口才能透明。
  • X11 with compositor:任何东西都可以透明。
  • 没有合成器的X11:没有什么可以透明。
  • Wayland(仍然是实验性的):任何东西都可以是透明的。

然而,Windows是一个特例。虽然您无法切换子窗口的透明度,或将其设置为百分比,但可以在创建时使其完全透明,如ρss's answer所示

所以,如果那是你正在寻找的东西,并且你想尽可能地做到这一点,你会想要这样的东西:

style = wx.TRANSPARENT_WINDOW if sys.platform.lower() == 'win32' else 0
panel1 = wx.Panel(topPanel, -1, style=style)
if panel1.CanSetTransparent:
    panel1.SetTransparent(100)