【问题标题】:wxpython: Transparent panel in wxpythonwxpython:wxpython 中的透明面板
【发布时间】:2015-07-08 14:58:52
【问题描述】:

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

【问题讨论】:

标签: python python-2.7 wxpython


【解决方案1】:

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

【讨论】:

  • 我相信wx 让平台特定于哪些类型的窗口可以在运行时透明,哪些只能在构建时透明,哪些根本不能透明。即使是顶级Frames 也不能保证处理透明度(例如,在没有合成器的 X11 系统上,它们不能)。这就是 CanSetTransparent 函数的用途。因此,这适用于您的计算机这一事实并不意味着它适用于他的计算机。
  • 另一方面,如果这 在他的计算机上工作,我认为这意味着什么都行不通(好吧,除了挖掘到实际的本机窗口句柄并通过ctypes 或包装器调用本机函数,我怀疑他想这样做……),所以我不确定任何人能写出什么更好的答案。
  • 是的@abarnert,你是对的,我是对的。 :P 我的答案仅适用于 Windows 操作系统。正如我在回答中提供的链接清楚地表明了这一点。
【解决方案2】:

视平台而定,哪些窗口可以透明,哪些不能透明。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2010-09-20
    • 2014-09-11
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多