如果将不透明度设置为零,wxpython 的 SetTransparent 不会捕获用户输入

Posted

技术标签:

【中文标题】如果将不透明度设置为零,wxpython 的 SetTransparent 不会捕获用户输入【英文标题】:wxpython's SetTransparent doesn't capture user input if set to an opacity of zero 【发布时间】:2011-10-03 23:17:51 【问题描述】:

我正在尝试制作一个 wxpython 窗口(只是一个窗口,因为它是一个窗口对象).. 填满整个屏幕并且完全不可见。然后我想允许用户在“窗口”(即屏幕上的任何位置)内单击并拖动。

当我尝试执行 self.SetTransparent(0) 时,窗口不会捕获用户输入。

这是预期的行为吗?

这是实现我想要的正确方法吗? 1 的不透明度对于人眼来说显然是无法区分的,但我仍然很好奇为什么我不能让它完全透明。

这是sn-p:

import wx

class Frame(wx.Frame):
    def __init__(self):
        style = (wx.STAY_ON_TOP | wx.NO_BORDER)
        wx.Frame.__init__(self, None, title="Invisible", style=style)

        self.SetTransparent(0) # This doesn't work
        #self.SetTransparent(1) # But this works fine

        self.Bind(wx.EVT_KEY_UP, self.OnKeyPress)

    def OnKeyPress(self, event):
        """quit if user press q or Esc"""
        if event.GetKeyCode() == 27 or event.GetKeyCode() == ord('Q'): #27 is Esc
            self.Close(force=True)
        else:
            event.Skip()

app = wx.App()
frm = Frame()
frm.ShowFullScreen(True)
app.MainLoop()

或者有没有办法让窗口完全没有背景而不是完全透明的彩色背景?

【问题讨论】:

并不是说它与回答你的问题有任何关系,而是你对这样的代码有什么用处?我唯一能想到的要么是键盘记录器,要么是糟糕的设计。 一个截图工具,允许您选择要裁剪的屏幕部分,然后上传。见gyazo。 你是对的,想想看,我可能会在屏幕上设置一个透明层,以显示程序正在运行。 【参考方案1】:

您可以覆盖EVT_ERASE_BACKGROUND 以实现相同的效果。

我还清理了代码的其他方面。

在 XP 和 7 上的行为略有不同,但对于您所描述的应用类型来说可能不是问题。

import wx

class Frame(wx.Frame):
    def __init__(self):
        super(Frame, self).__init__(None)
        self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
        self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
        self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
    def OnEraseBackground(self, event):
        pass # do nothing
    def OnLeftDown(self, event):
        print event.GetPosition()
    def OnKeyDown(self, event):
        if event.GetKeyCode() == wx.WXK_ESCAPE:
            self.Close()
        else:
            event.Skip()

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = Frame()
    frame.ShowFullScreen(True)
    app.MainLoop()

【讨论】:

以上是关于如果将不透明度设置为零,wxpython 的 SetTransparent 不会捕获用户输入的主要内容,如果未能解决你的问题,请参考以下文章

如何使 UIButton 不可见,但如果按下仍然可以工作?

如何将不透明度设置为 div 的背景颜色? [复制]

将不透明度设置为滑动标签布局?

threejs setClearColor 将不透明度设置为 0 尽管背景不存在

在 x 轴上移动时将不透明度从 0 设置为 1 到 1

如何使角垫表中的排序箭头始终可见?