Python, продвигающийся экран

Я кодирую приложение, которое должно выбрать область экрана. Я должен изменить курсор на крест и затем потянуть прямоугольник на пользовательском выборе. Первая вещь, которую я искал, состоит в том, как управлять курсором, и я столкнулся с wxPython. С wxPython я мог легко сделать это на Кадре с Панелью, вещь состоит в том, что мне было бы нужно окно, чтобы быть прозрачным, таким образом, пользователь видит свой экран, в то время как выбирает желаемую область, но если я делаю Кадр, и Панель возражает прозрачный, все получает багги.

Так, я открыт для любого решения, или использующего wxPython или не использующий его, потому что я действительно не знаю, использую ли я его право.

Я плохо знаком с Python, и я не носитель английского языка, таким образом, я сожалею, если Вы не можете понять что-то.

Это - то, что я кодировал

import wx

class SelectableFrame(wx.Frame):

    c1 = None
    c2 = None

    def __init__(self, parent=None, id=-1, title=""):
        wx.Frame.__init__(self, parent, id, title, size=wx.DisplaySize(), style=wx.TRANSPARENT_WINDOW)

        self.panel = wx.Panel(self, size=self.GetSize(), style=wx.TRANSPARENT_WINDOW)

        self.panel.Bind(wx.EVT_MOTION, self.OnMouseMove)
        self.panel.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown)
        self.panel.Bind(wx.EVT_LEFT_UP, self.OnMouseUp)
        self.panel.Bind(wx.EVT_PAINT, self.OnPaint)

        self.SetCursor(wx.StockCursor(wx.CURSOR_CROSS))

    def OnMouseMove(self, event):
        if event.Dragging() and event.LeftIsDown():
            self.c2 = event.GetPosition()
            self.Refresh()

    def OnMouseDown(self, event):
        self.c1 = event.GetPosition()

    def OnMouseUp(self, event):
        self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW))

    def OnPaint(self, event):
        if self.c1 is None or self.c2 is None: return

        dc = wx.PaintDC(self.panel)
        dc.SetPen(wx.Pen('red', 1))
        dc.SetBrush(wx.Brush(wx.Color(0, 0, 0), wx.TRANSPARENT))

        dc.DrawRectangle(self.c1.x, self.c1.y, self.c2.x - self.c1.x, self.c2.y - self.c1.y)

    def PrintPosition(self, pos):
        return str(pos.x) + " " + str(pos.y)


class MyApp(wx.App):

    def OnInit(self):
        frame = SelectableFrame()
        frame.Show(True)
        self.SetTopWindow(frame)

        return True



app = MyApp(0)
app.MainLoop()
6
задан Franco 24 February 2010 в 04:45
поделиться

1 ответ

Вы не должны использовать wx.TRANSPARENT при создании окна, которое в основном используется для команд рисования wxDC. Чтобы сделать окно прозрачным, просто вызовите win.SetTransparent (amount), где количество от 0 до 255, 255 означает непрозрачный, 0 означает полностью прозрачный. см. http://www.wxpython.org/docs/api/wx.Window-class.html#SetTransparent

Я изменил ваш код, он будет работать, только если ваша платформа поддерживает прозрачные окна, вы можете проверить что от CanSetTransparent. Я тестировал его на Windows XP.

import wx

class SelectableFrame(wx.Frame):

    c1 = None
    c2 = None

    def __init__(self, parent=None, id=-1, title=""):
        wx.Frame.__init__(self, parent, id, title, size=wx.DisplaySize())

        self.panel = wx.Panel(self, size=self.GetSize())

        self.panel.Bind(wx.EVT_MOTION, self.OnMouseMove)
        self.panel.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown)
        self.panel.Bind(wx.EVT_LEFT_UP, self.OnMouseUp)
        self.panel.Bind(wx.EVT_PAINT, self.OnPaint)

        self.SetCursor(wx.StockCursor(wx.CURSOR_CROSS))

        self.SetTransparent(50)

    def OnMouseMove(self, event):
        if event.Dragging() and event.LeftIsDown():
            self.c2 = event.GetPosition()
            self.Refresh()

    def OnMouseDown(self, event):
        self.c1 = event.GetPosition()

    def OnMouseUp(self, event):
        self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW))

    def OnPaint(self, event):
        if self.c1 is None or self.c2 is None: return

        dc = wx.PaintDC(self.panel)
        dc.SetPen(wx.Pen('red', 1))
        dc.SetBrush(wx.Brush(wx.Color(0, 0, 0), wx.TRANSPARENT))

        dc.DrawRectangle(self.c1.x, self.c1.y, self.c2.x - self.c1.x, self.c2.y - self.c1.y)

    def PrintPosition(self, pos):
        return str(pos.x) + " " + str(pos.y)


class MyApp(wx.App):

    def OnInit(self):
        frame = SelectableFrame()
        frame.Show(True)
        self.SetTopWindow(frame)

        return True


app = MyApp(0)
app.MainLoop()
5
ответ дан 17 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: