wxpython:wxpython中的透明面板

Dee*_*epa 3 python wxpython python-2.7

在 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()
Run Code Online (Sandbox Code Playgroud)

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

ρss*_*ρss 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()
Run Code Online (Sandbox Code Playgroud)

  • 我相信“wx”使其特定于平台,哪些类型的窗口可以在运行时透明,哪些只能在构造时透明,哪些根本不能透明。即使顶级“Frame”也不能保证处理透明度(例如,在没有合成器的 X11 系统上,它们不能)。这就是“CanSetTransparent”函数的用途。因此,这在您的计算机上有效并不意味着它在他的计算机上也有效。 (2认同)

aba*_*ert 5

哪些窗口可以透明,哪些不能透明,这是特定于平台的。

\n\n

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

\n\n

从我的脑海中浮现出来(但不要在这个\xe2\x80\x94上引用我,它必须记录在某处,但我找不到它\xe2\x80\xa6):

\n\n
    \n
  • 采用 Cocoa 构建的 Mac OS X:任何事物都可以是透明的。
  • \n
  • 采用 Carbon 版本的 Mac OS X(没有人再使用):只有顶层窗口可以是透明的。
  • \n
  • 窗口:只有顶层窗口可以是透明的。
  • \n
  • 带合成器的 X11:任何东西都可以是透明的。
  • \n
  • 没有合成器的 X11:没有什么可以是透明的。
  • \n
  • Wayland(仍处于实验阶段):任何事物都可以是透明的。
  • \n
\n\n

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

\n\n

因此,如果这就是您正在寻找的,并且您想要尽可能便携地做到这一点,那么您将需要这样的东西:

\n\n
style = wx.TRANSPARENT_WINDOW if sys.platform.lower() == \'win32\' else 0\npanel1 = wx.Panel(topPanel, -1, style=style)\nif panel1.CanSetTransparent:\n    panel1.SetTransparent(100)\n
Run Code Online (Sandbox Code Playgroud)\n