wxpython:在wxpython中实现透明面板

3
使用 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设置透明度。

panel1.CanSetTransparent() 返回什么? - abarnert
你用的是哪个平台? - abarnert
2个回答

6

是的,这是可能的。您可以使用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()

2
我相信 wx 会根据平台的不同来决定哪些窗口可以在运行时设置透明度,哪些只能在构建时设置透明度,以及哪些窗口根本无法设置透明度。即使是顶级的 Frame 窗口也不能保证支持透明度(例如,在没有合成器的 X11 系统上就不支持)。这就是 CanSetTransparent 函数的作用。因此,这个功能在你的电脑上可行并不意味着它在他的电脑上也一定可行。 - abarnert
另一方面,如果这在他的计算机上不起作用,我认为这意味着没有什么东西会起作用(除了通过 ctypes 或包装器调用本地函数,这需要挖掘实际的本地窗口句柄,但我怀疑他不想这样做...),因此我不确定还有什么更好的答案可以编写。 - abarnert
是的 @abarnert,你是对的,我是错的。:P 我的答案只适用于Windows操作系统。因为我在回答中提供的链接清楚地说明了这一点。 - ρss

5

这取决于平台,哪些窗口可以透明,哪些不可以。

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

从我的经验来看(但不要引用我——这一定有文档记录,但我找不到了……):

  • 使用Cocoa构建的Mac OS X:任何东西都可以是透明的。
  • 使用Carbon构建的Mac OS X(现在没有人再使用):只有顶层窗口可以是透明的。
  • Windows:只有顶层窗口可以是透明的。
  • 使用合成器的X11:任何东西都可以是透明的。
  • 没有合成器的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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接