透明面板

2024-06-16 08:23:42 发布

您现在位置:Python中文网/ 问答频道 /正文

在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设置透明度。在


Tags: selfinitdefvalframeclasswxpanel
2条回答

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

^{}方法允许您检查是否可以在运行时切换窗口的透明度。如果它返回false,SetTransparent将(通常)什么也不做,您不应该调用它。在

在我的脑海里(但不要引用我的话,它必须在某个地方记录下来,但我找不到它…):

  • 具有Cocoa构建的macosx:任何东西都可以是透明的。在
  • 具有carbonbuild的macosx(现在没有人使用):只有顶级的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)

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

相关问题 更多 >