рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рдЫреЛрдЯреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╣рдо рдПрдХ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП WxPython рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдХреИрд╕реЗ рдмрдирд╛рдПрдВрдЧреЗред рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдФрд░ рд╕рдордЧреНрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рдЪреАрдЬреЛрдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ)ред
рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдпрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдЕрдм рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рднрд╛рдЧ 1: рдбреНрд░рд╛ рдХрд░рдирд╛ рд╕реАрдЦрдирд╛рднрд╛рдЧ 2: рдорд╛рдЙрд╕ рдИрд╡реЗрдВрдЯреНрд╕ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдирд╛рднрд╛рдЧ 3: рд╕реБрд╡рд┐рдзрд╛рдУрдВ + рдХреАрдмреЛрд░реНрдб рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд░реА рд╣реИрднрд╛рдЧ 4: рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛рднрд╛рдЧ 5: рдиреЛрдб рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВрдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ ...
рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдорд┐рд▓рд╛ рдерд╛, рдЬреЛ рдХреИрдирд╡рд╛рд╕ рдкрд░ рд╕рд░рд▓ рдиреЛрдбреНрд╕ рдмрдирд╛рддрд╛ рд╣реИ (рдкрд╛рда рдХреЗ рд╕рд╛рде рдЖрдпрддреЗрдВ)ред рдпрд╣ рдиреЛрдбреНрд╕ рдХреЛ рдЬрдВрдЧрдо рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
4. рдЬрдм рдЖрдк рдЙрди рдкрд░ рдордВрдбрд░рд╛рддреЗ рд╣реИрдВ рддреЛ рд╣рд╛рдИрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ
рд▓реЗрдХрд┐рди рдиреЛрдбреНрд╕ рдХреЗ рдЖрдВрджреЛрд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрдирд╛рдПрдВрдЧреЗ: рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЬрдм рдЖрдк рдЙрд╕ рдкрд░ рдордВрдбрд░рд╛рддреЗ рд╣реИрдВред рдмрд╛рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рднрд╛рдЧ рдмрд╛рдж рдореЗрдВ рдХрд╛рдо рдЖрдПрдВрдЧреЗред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ 3 рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:
1) рдЯреНрд░реИрдХ рдХрд░реНрд╕рд░ рдЖрдВрджреЛрд▓рди
2) рдХрд░реНрд╕рд░ рдХреЗ рдиреАрдЪреЗ рд╕рдмрд╕реЗ рдКрдкрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдвреВрдВрдвреЗрдВ рдФрд░ рд╕рд╣реЗрдЬреЗрдВ
3) рдЗрд╕ рд╡рд╕реНрддреБ рдХрд╛ рд░реЗрдВрдбрд░ рдЪрдпрди
рдХрд░реНрд╕рд░ рдЖрдВрджреЛрд▓рди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреИрдирд╡рд╛рд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
self.Bind(wx.EVT_MOTION, self.OnMouseMotion)
рдЕрдм, рдХрд░реНрд╕рд░ рдХреЛ рд▓реЗ рдЬрд╛рддреЗ рд╕рдордп, рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:
def OnMouseMotion(self, evt): pos = self.CalcUnscrolledPosition(evt.GetPosition()).Get() self._objectUnderCursor = self.FindObjectUnderPoint(pos) self.Render()
рдпрд╣рд╛рдВ рддреАрди рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ: рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХрд░реНрд╕рд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рдХреИрдирд╡рд╛рд╕ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдХреНрд░реЙрд▓ рд╣реИ), рдлрд┐рд░ рд╣рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБ рдвреВрдВрдврдиреА рд╣реЛрдЧреА рдФрд░ рдЫрд╡рд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд┐рд╕ рд╡рд╕реНрддреБ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдХрд░реНрд╕рд░ рдкреНрд░рдХрдЯ рд╣реЛ рд╕рдХреЗ ред рдХрд░реНрд╕рд░ рдХреЗ рдиреАрдЪреЗ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╣реИ:
def FindObjectUnderPoint(self, pos):
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рддреБрдЪреНрдЫ рд╣реИ рдФрд░ рдмрд╣реБрдд рдирд╣реАрдВред рдПрдХ рдУрд░, рд╣рдо рдмрд╕ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдХреЗ рд▓рд┐рдП рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рдХрд░реНрд╕рд░ рдХреЗ рдиреАрдЪреЗ рд╕реНрдерд┐рдд рд╣реИред рдФрд░ рд╣рдо рдЗрд╕реЗ рдЙрд▓реНрдЯреЗ рдХреНрд░рдо рдореЗрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЙрдЪреНрдЪрддрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдЕрдВрддрд┐рдо рдЬреЛрдбрд╝реА рдЧрдИ рд╡рд╕реНрддреБред рджреВрд╕рд░реА рдУрд░, рд╣рдо "ReturnObjectUnderCursor" рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд┐рд╕ рд╡рд╕реНрддреБ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рд░реНрдЬрд┐рди рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрдк рдиреЛрдбреНрд╕ рдмрдирд╛ рд╕рдХреЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реНрд╡рдпрдВ рдореЗрдВ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдиреЛрдб рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдиреЛрдбреНрд╕ рдпрд╛ рдХреЛрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди)ред рдЕрдм рддрдХ, рд╣рдорд╛рд░реЗ рдиреЛрдб рдкрд░ рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдВрдЪрддреА рд╣реИ рдХрд┐ рдХрд░реНрд╕рд░ рдЖрдпрдд рдореЗрдВ рд╣реИ рдпрд╛ рдирд╣реАрдВ:
def ReturnObjectUnderCursor(self, pos): if pos[0] < self.position[0]: return None if pos[1] < self.position[1]: return None if pos[0] > self.position[0]+self.boundingBoxDimensions[0]: return None if pos[1] > self.position[1]+self.boundingBoxDimensions[1]: return None return self
рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╣рдореЗрд╢рд╛ рдпрд╣ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд░реНрд╕рд░ рдХреЗ рдиреАрдЪреЗ рдХреМрди рд╕реА рд╡рд╕реНрддреБ рд╣реИ, рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЗрд╕реЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд╕реЗрд▓реЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдпрд╣ рдХреЛрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛:
if self._objectUnderCursor: gc.PushState() self._objectUnderCursor.RenderHighlighting(gc) gc.PopState()
рдпрд╣ рдиреЛрдб рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ:
def RenderHighlighting(self, gc): gc.SetBrush(wx.Brush('#888888', wx.TRANSPARENT)) gc.SetPen(wx.Pen('#888888', 3, wx.DOT)) gc.DrawRectangle(self.position[0]-3, self.position[1]-3, self.boundingBoxDimensions[0]+6, self.boundingBoxDimensions[1]+6)
рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдкрд╛рд░рджрд░реНрд╢реА рдмреНрд░рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЬрдм рд╣рдо рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВ рдЬреЛ рдкрд╣рд▓реЗ рдЧрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдпрд╛рдиреА, рдиреЛрдб рд╣реА) рдУрд╡рд░рд░рд╛рдЗрдЯ рди рдХрд░реЗрдВред
рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рддрд╕реНрд╡реАрд░ рд╣реИ:

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рдж рдХрд░реНрд╕рд░ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдирд╣реАрдВ рд╣реИ :)
рдореБрдЭреЗ рдпрд╣рд╛рдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рднреА рдХреЛрдб рдирд╣реАрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ,
рдпрд╣ GitHub рдкрд░ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИред
5. рдЫреЛрдЯреЗ рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдЬреЛрдбрд╝рдирд╛
рдФрд░ рдлрд┐рд░, рд╣рдо рдЕрдкрдиреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реНрдердЧрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕ рдмрд╛рд░ рдереЛрдбрд╝рд╛ рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдПред рдЪреВрдВрдХрд┐ рдпрд╣ рдврд╛рдВрдЪрд╛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдиреЛрдбреНрд╕ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЧреИрд░-рдЪрд▓ рд╡рд╛рд▓реЗ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдЬреЛ рд╕реНрд╡рдпрдВ рд╡рд╕реНрддреБрдУрдВ рдпрд╛ рдиреЛрдб рдХреЗ рдХреБрдЫ рдШрдЯрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реИрд╕реЗ рднреА, рдореИрдВ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд╕рдЪ рд╣реИ, рдЕрдм рдХреЗ рд▓рд┐рдП рд╣рдо abc, zope.interface рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдмрд╕ рдХреИрдирд╡рд╛рд╕ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ:
class CanvasObject(object): def __init__(self):
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдорд╛рдирдХ рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди 3 рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рдХреИрдирд╡рд╛рд╕ рдкрд░ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЬреЛ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ, рд╣рдореЗрдВ рдХреИрдирд╡рд╛рд╕ рдкрд░ рдРрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ рдЬреЛ рд╣рдо (рд░реЗрдВрдбрд░) рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдХрд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдХ рдХрд░реЗрдВ (ReturnObjectUnderCursor, RenderHighlighting)ред рдФрд░ рдпрд╣рд╛рдВ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдиреЛрдбреНрд╕ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рд╡реЗ рдЪрд▓ рд╕рдХрдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рд╣реИ:
from MoveMe.Canvas.Objects.Base.CanvasObject import CanvasObject class MovableObject(CanvasObject): def __init__(self, position): super(MovableObject, self).__init__() self.position = position self.movable = True
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдпрд╣ рд╡рд░реНрдЧ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реА рдЙрдкрдпреЛрдЧреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рднреА рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд┐рдирд╛ рдХреБрдЫ рдХреЛ рдПрдХ рд╕реНрдерд┐рддрд┐ рд╕реЗ рджреВрд╕рд░реЗ рд╕реНрдерд╛рди рдкрд░ рд▓реЗ рдЬрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЕрдм рд╣рдорд╛рд░реЗ рдиреЛрдб рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдИ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдорд╛рд░реА рдирдИ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдмрди рдЧрдИ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдЕрднреА рднреА рд╡рд╣реА рдкреБрд░рд╛рдирд╛ рдкреБрд░рд╛рдирд╛ рдиреЛрдб рд╣реИ:
from MoveMe.Canvas.Objects.Base.CanvasObject import CanvasObject from MoveMe.Canvas.Objects.Base.MovableObject import MovableObject class SimpleBoxNode(MovableObject, CanvasObject): ...........
6. рдЪрд▓рддреЗ рд╣реБрдП рдиреЛрдбреНрд╕
рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЪрд▓рддреЗ рд╣реБрдП рдиреЛрдбреНрд╕ рдХреЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдорд┐рд▓рд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ 2 рдмреБрдирд┐рдпрд╛рджреА рдХрджрдо рдЙрдард╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдХрд┐рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЦреАрдВрдЪрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛ (рдпрд╛рдиреА рдмрд╛рдИрдВ рдорд╛рдЙрд╕ рдмрдЯрди рдХреНрд▓рд┐рдХ рдХреЗ рд╕рдордп рдХрд░реНрд╕рд░ рдХреЗ рдиреАрдЪреЗ рдХреМрди рд╕реА рд╡рд╕реНрддреБ рдереА) рдФрд░ рдХрд░реНрд╕рд░ рдХреЛ рд▓реЗ рдЬрд╛рдиреЗ рддрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдЬрдм рддрдХ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд╛рдЙрд╕ рдмрдЯрди рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд░рддрд╛ред
рдкрд╣рд▓реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
def OnMouseLeftDown(self, evt): if not self._objectUnderCursor: return if self._objectUnderCursor.movable: self._lastDraggingPosition = self.CalcUnscrolledPosition(evt.GetPosition()).Get() self._draggingObject = self._objectUnderCursor self.Render()
рд╣рдо рдмрд╕ рдХрд░реНрд╕рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдХрд░реНрд╕рд░ рдХреЗ рдиреАрдЪреЗ рдХреА рд╡рд░реНрддрдорд╛рди рд╡рд╕реНрддреБ рдХреЛ рдпрд╛рдж рд░рдЦрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рддрдХ рдХрд┐ рдХрд░реНрд╕рд░ рдХреЗ рдиреАрдЪреЗ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рдореМрдЬреВрджрдЧреА рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╢реВрдиреНрдп рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░рд╛ рднрд╛рдЧ рдереЛрдбрд╝рд╛ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ
def OnMouseMotion(self, evt): pos = self.CalcUnscrolledPosition(evt.GetPosition()).Get() self._objectUnderCursor = self.FindObjectUnderPoint(pos) if not evt.LeftIsDown(): self._draggingObject = None if evt.LeftIsDown() and evt.Dragging() and self._draggingObject: dx = pos[0]-self._lastDraggingPosition[0] dy = pos[1]-self._lastDraggingPosition[1] newX = self._draggingObject.position[0]+dx newY = self._draggingObject.position[1]+dy
рдкрд╣рд▓рд╛ рдЪреЗрдХ рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреБрдЫ рд╕рдордп рдореЗрдВ рдорд╛рдЙрд╕ рдХреЛ рдмрд╛рдПрдВ рдмрдЯрди рдХреЗ рд╕рд╛рде рдЫреЛрдбрд╝рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡рд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдмрдЯрди рдХреЗ рд░рд┐рд▓реАрдЬрд╝ рдЗрд╡реЗрдВрдЯ рдХреА рдЧрддрд┐ рдХреЛ рд░реЛрдХрдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд░реНрд╕рд░ рд╡рд┐рдВрдбреЛ рдХреЗ рдмрд╛рд╣рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╣рдореЗрдВ рдпрд╣ рдИрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рддрдм рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдЦреАрдВрдЪ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреА рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╡рд┐рд╕реНрдерд╛рдкрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреАрдмреЛрд░реНрдб рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ (рдХреНрдпрд╛ Ctrl рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдХреБрдЫ рдФрд░, рдпрд╣ рдмрд╛рдж рдореЗрдВ рд╣реЛрдЧрд╛)ред рдХреИрдирд╡рд╛рд╕ рд╕реЗ рдкрд░реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдПрдХ рдЪреЗрдХ рд╣реИред рдЗрд╕ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдПрдХ рддрд░рдл, рдпрджрд┐ рдХреИрдирд╡рд╛рд╕ рдХрд╛ рдЖрдХрд╛рд░ рддрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рджреВрд╕рд░реА рддрд░рдл, рдХреИрдирд╡рд╛рд╕ рдХреЛ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЦреАрдВрдЪрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдЖрджрд░реНрд╢ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ)ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕ рд╕рдордп, рдХреИрдирд╡рд╛рд╕ рдХрд╛ рдЖрдХрд╛рд░ рддрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдиреЛрдбреНрд╕ рдХреИрдирд╡рд╛рд╕ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдВрдЧреЗред
рдпрд╣ рд╕рдм рд╣реИ, рдЕрдм рд╣рдо рдХреИрдирд╡рд╛рд╕ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдб
GitHub рдкрд░ рдЗрд╕ рдкреНрд░рддрд┐рдмрджреНрдз рдореЗрдВ рд░рд╣рддрд╛
рд╣реИ ред рдФрд░ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рдкреБрдирд╢реНрдЪ: рдЯрд╛рдЗрдкреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдореЗрдВ рд▓рд┐рдЦреЗрдВред