wxPython базовый Каирский рисунок перетаскиванием мышью - PullRequest
0 голосов
/ 24 марта 2012

У меня никогда нет кода на Python, и я пытаюсь переключиться с Javascrpt / SVG. Будучи запутанным в области видимости переменных в Python и в потоке процессов, я буду признателен за любые исправления этого базового кода, чтобы он рисовал прямоугольник с помощью событий mousedown и mouseup. Пожалуйста, не помещайте ссылки на инструкции, если вы не указали мне на ошибки в коде.

если name == " main ": импорт WX импорт математика

class myframe(wx.Frame):
    pt1 = 0
    pt2 = 0
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "test", size=(500,400))
        self.Bind(wx.EVT_LEFT_DOWN, self.onDown)
        self.Bind(wx.EVT_LEFT_UP, self.onUp)
        self.Bind(wx.EVT_PAINT, self.drawRect)

    def onDown(self, event):          
        global pt1
        pt1 = event.GetPosition() # firstPosition tuple

    def onUp(self, event):          
        global pt2
        pt2 = event.GetPosition() # secondPosition tuple

    def drawRect(self, event):
        dc = wx.PaintDC(self)
        gc = wx.GraphicsContext.Create(dc)
        nc = gc.GetNativeContext()
        ctx = Context_FromSWIGObject(nc)

        ctx.rectangle (pt1.x, pt1.y, pt2.x, pt2.y) # Rectangle(x0, y0, x1, y1)
        ctx.set_source_rgba(0.7,1,1,0.5)
        ctx.fill_preserve()
        ctx.set_source_rgb(0.1,0.5,0)
        ctx.stroke()


app = wx.App()
f = myframe()
f.Show()
app.MainLoop()

1 Ответ

1 голос
/ 24 марта 2012

Да, у вас проблема с областями видимости (плюс - ваш код не отображается должным образом).

Позвольте привести вам краткий пример использования членов и глобальных переменных в python:

# Globals are defined globally, not in class
glob1 = 0

class C1:
    # Class attribute
    class_attrib = None  # This is rarely used and tricky

    def __init__(self):
        # Instance attribute
        self.pt1 = 0  # That's the standard way to define attribute

    def other_method(self):
        # Use of a global in function
        global glob1
        glob1 = 1

        # Use of a member
        self.pt1 = 1

# Use of a class attribute
C1.class_attrib = 1

В вашем коде вы смешиваете все типы переменных.Я думаю, что вы должны просто сделать атрибуты экземпляров pt1 и pt2, чтобы ваш код выглядел следующим образом:

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "test", size=(500,400))
        self.pt1 = self.pt2 = 0
        ...

    def onDown(self, event):          
        self.pt1 = event.GetPosition() # firstPosition tuple

    ...

Вы можете прочитать какой-нибудь общий учебник, например этот , чтобы узнать, как работает Pythonработы.

...