SetTransparent wxpython не захватывает ввод пользователя, если установлен на непрозрачность ноль - PullRequest
3 голосов
/ 13 июля 2011

Я пытаюсь создать окно wxpython (только окно в том смысле, что это объект окна) .. которое заполняет весь экран и полностью невидимо. Затем я хочу позволить пользователю щелкнуть и перетащить в «окно» (т. Е. В любое место на экране).

Когда я пытаюсь выполнить self.SetTransparent(0), пользовательский ввод не захватывается окном.

Это предполагаемое поведение?

Это правильный способ достичь того, чего я хочу? Непрозрачность 1, очевидно, неразличима для человеческого глаза, но мне все еще интересно, почему я не могу сделать ее полностью прозрачной.

Вот фрагмент:

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()

Или есть способ вообще не задавать окну фон, а не полностью прозрачный цветной фон?

1 Ответ

1 голос
/ 13 июля 2011

Вы можете переопределить 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()
...