wxpython:wxpython 中的透明面板
wxpython: Transparent panel in 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 设置透明度。
是的,这是可能的。您可以使用 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()
它是特定于平台的,windows 可以透明,也可以不透明。
CanSetTransparent
方法允许您检查 window 的透明度是否可以在运行时切换。如果它 returns false,SetTransparent
将(通常)不做任何事情,你不应该调用它。
超出我的想象(但不要引用我的话——它必须在某处记录,但我找不到它……):
- Mac OS X with Cocoa 构建:任何东西都可以是透明的。
- Mac OS X with Carbon build(没人再用了):只有顶级 windows 可以透明。
- Windows: 只有顶层windows可以透明
- 带有合成器的 X11:任何东西都可以是透明的。
- 没有合成器的 X11:没有什么是透明的。
- Wayland(仍处于实验阶段):任何东西都可以是透明的。
不过,Windows是个特例。虽然您无法切换子 window 的透明度,或将其设置为百分比,但您 可以 在创建时使其完全透明,如 .
所以,如果这就是您正在寻找的东西,并且您希望尽可能便携地完成它,那么您将需要这样的东西:
style = wx.TRANSPARENT_WINDOW if sys.platform.lower() == 'win32' else 0
panel1 = wx.Panel(topPanel, -1, style=style)
if panel1.CanSetTransparent:
panel1.SetTransparent(100)
在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 设置透明度。
是的,这是可能的。您可以使用 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()
它是特定于平台的,windows 可以透明,也可以不透明。
CanSetTransparent
方法允许您检查 window 的透明度是否可以在运行时切换。如果它 returns false,SetTransparent
将(通常)不做任何事情,你不应该调用它。
超出我的想象(但不要引用我的话——它必须在某处记录,但我找不到它……):
- Mac OS X with Cocoa 构建:任何东西都可以是透明的。
- Mac OS X with Carbon build(没人再用了):只有顶级 windows 可以透明。
- Windows: 只有顶层windows可以透明
- 带有合成器的 X11:任何东西都可以是透明的。
- 没有合成器的 X11:没有什么是透明的。
- Wayland(仍处于实验阶段):任何东西都可以是透明的。
不过,Windows是个特例。虽然您无法切换子 window 的透明度,或将其设置为百分比,但您 可以 在创建时使其完全透明,如
所以,如果这就是您正在寻找的东西,并且您希望尽可能便携地完成它,那么您将需要这样的东西:
style = wx.TRANSPARENT_WINDOW if sys.platform.lower() == 'win32' else 0
panel1 = wx.Panel(topPanel, -1, style=style)
if panel1.CanSetTransparent:
panel1.SetTransparent(100)