рдиреЛрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП WxPython рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред рднрд╛рдЧ 4: рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛

рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рдЫреЛрдЯреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╣рдо рдПрдХ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП WxPython рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдХреИрд╕реЗ рдмрдирд╛рдПрдВрдЧреЗред рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдФрд░ рд╕рдордЧреНрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рдЪреАрдЬреЛрдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ)ред



рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рд╕рдкреЛрд░реНрдЯ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдФрд░ рдЙрд╕реЗ рд╕рд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирдП рдиреЛрдбреНрд╕ рдХреИрд╕реЗ рдмрдирд╛рдПрдВред

рднрд╛рдЧ 1: рдбреНрд░рд╛ рдХрд░рдирд╛ рд╕реАрдЦрдирд╛
рднрд╛рдЧ 2: рдорд╛рдЙрд╕ рдИрд╡реЗрдВрдЯреНрд╕ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдирд╛
рднрд╛рдЧ 3: рд╕реБрд╡рд┐рдзрд╛рдУрдВ + рдХреАрдмреЛрд░реНрдб рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд░реА рд╣реИ
рднрд╛рдЧ 4: рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛
рднрд╛рдЧ 5: рдиреЛрдб рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ

рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ ...


9. рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ


рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рд╕рдорд░реНрдерди рдПрдХ рдЙрдкрдпреЛрдЧреА рдФрд░ рд▓реЛрдХрдкреНрд░рд┐рдп рдЪреАрдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреЗ рдЗрдЪреНрдЫрд┐рдд рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рддрд░рд╣ рд╣рдо рдирдП рдиреЛрдб рдмрдирд╛рдПрдВрдЧреЗред рдпрд╣ рд╡реНрдпрд╡рд╕рд╛рдп рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХрдХреНрд╖рд╛ "wx.TextDropTarget" рдХреА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдирд╛ рдФрд░ рдЙрд╕реЗ "SetDropTarget" рд╡рд┐рдзрд┐ рдХреЗ рд╡рд░реНрдЧ "wx.Window" рд╕реЗ рдкрд╛рд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд╣рд╛рдБ рд╕реЗ рд╣рдорд╛рд░рд╛ рдХреИрдирд╡рд╛рд╕ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдбреНрд░реЙрдк рдХреЗ рд╕рдордп, "wx.TextDropTarget.OnDropText" рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
class TextDropTarget(wx.TextDropTarget): def __init__(self): wx.TextDropTarget.__init__(self) def OnDropText(self, x, y, data): print x, y, data 

рдЕрдм, рдЬрдм рдПрдХ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдкрд╛рда рдлреЗрдВрдХрддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдерд┐рддрд┐ рдФрд░ рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджреЗрд╢ рд╕реНрд╡рдпрдВ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдорд╛рди рд╡рд░реНрдЧ "wx.FileDropTarget" рд╣реИ рдЬреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдареАрдХ рд╣реИ, рдпрд╛ рдПрдХ рд╡рд░реНрдЧ "wx.PyDropTarget" рдЬреЛ рд╕рдм рдХреБрдЫ рдФрд░ рд╕рдм рдХреБрдЫ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

10. рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХреЗ рд╕рд╛рде рдиреЛрдбреНрд╕ рдмрдирд╛рдирд╛


рдмрд╕ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЯреЗрдХреНрд╕реНрдЯ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдиреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореА рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдиреЗ рдФрд░ рдиреЛрдб рдлреИрдХреНрдЯрд░реА рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдореЗрдВ рдЖрдПрдЧрд╛)ред рдлрд┐рд▓рд╣рд╛рд▓ - рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХрд╛рд░рдЦрд╛рдирд╛ рд╣реЛрдЧрд╛:
 class NodesFactory(object): def __init__(self): pass def CreateNodeFromDescription(self, nodeDescription): return SimpleTextBoxNode(text=nodeDescription) 

рдЬреЛ рдмрд╕ "SimpleTextBoxNode" рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрд╢рд╛ "SimpleBoxNode" рдХрд╛ рдПрдХ рдЙрдиреНрдирдд рд╡рдВрд╢рдЬ рд╣реЛрддрд╛ рд╣реИ:
 class SimpleTextBoxNode(SimpleBoxNode): def __init__(self, **kwargs): super(SimpleTextBoxNode, self).__init__(**kwargs) self.text = kwargs.get("text", "No text") def Render(self, gc): super(SimpleTextBoxNode, self).Render(gc) gc.DrawText(self.text, self.position[0]+10, self.position[1]+10) 

рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рджрд┐рдП рдЧрдП рдкрд╛рда рдХреЛ рдЖрдпрддрд╛рдХрд╛рд░ рдиреЛрдб рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдХреИрдирд╡рд╛рд╕ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рд╡рд┐рд╡рд░рдг рд╕реЗ рдирдП рдиреЛрдб рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
  def CreateNodeFromDescriptionAtPosition(self, nodeDescription, pos): node = self._nodesFactory.CreateNodeFromDescription(nodeDescription) if node: node.position = pos self._canvasObjects.append(node) self.Render() 

рдФрд░ TextDropTarget рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░реЗрдВ рддрд╛рдХрд┐ рдкрд╛рда рдЖрдиреЗ рдкрд░ рдпрд╣ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗ:
 class TextDropTarget(wx.TextDropTarget): def __init__(self, canvas): wx.TextDropTarget.__init__(self) self._canvas = canvas def OnDropText(self, x, y, data): print x, y, data self._canvas.CreateNodeFromDescriptionAtPosition(data, [x, y]) 

рдФрд░ рдЕрдм рд╣рдо рдХреИрдирд╡рд╛рд╕ рдкрд░ рдкрд╛рда рдЕрдВрд╢реЛрдВ рдХреЛ рдлреЗрдВрдХрдХрд░ рдирдП рдкрд╛рда рдиреЛрдбреНрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдХреЛрдб, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, GitHub рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддрд┐рдмрджреНрдз рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

11. рдЦреАрдВрдЪреЗрдВ рдФрд░ рдбреНрд░реЙрдк рдХреЗ рд╕рд╛рде рдХреНрд▓реЛрди рдиреЛрдбреНрд╕


рд▓реЗрдХрд┐рди рдиреЛрдбреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдХреЙрдкреА рдиреЛрдбреНрд╕ рднреА рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдиреЛрдб рдХреЛ рдЦреАрдВрдЪрддреЗ рд╕рдордп Ctrl рдкрдХрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдмрд╕ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдиреЛрдб рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдиреЛрдб рдирд┐рд░реНрдорд╛рдг рдХреЛрдб рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╛рдХреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╛рдПрдБ рдХреЛрдб рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ:
  if evt.ControlDown() and self._objectUnderCursor.clonable: text = self._objectUnderCursor.GetCloningNodeDescription() data = wx.TextDataObject(text) dropSource = wx.DropSource(self) dropSource.SetData(data) dropSource.DoDragDrop(wx.Drag_AllowMove) 

рдпрд╣рд╛рдВ рд╣рдо рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХрд╛ рд╕реНрд░реЛрдд рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд╣ рд╡рд┐рд╡рд░рдг рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдиреЛрдб рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рдерд╛ред рдпрд╣ рдиреЛрдб рдкрд░ GetCloningNodeDescription рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
 class ClonableObject(CanvasObject): def __init__(self, **kwargs): super(ClonableObject, self).__init__(**kwargs) self.clonable = True def GetCloningNodeDescription(self): """ GetNodeDescription should return a dictionary that contains all information required for cloning this node at another position """ raise NotImplementedError() 

рдФрд░ рдЕрдм рдиреЛрдб рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
  def GetCloningNodeDescription(self): return self.text 

рдЬреЛ рд╕рд┐рд░реНрдл рдЙрд╕реЗ рдкрд╛рда рджреЗрддрд╛ рд╣реИред
рдХреЛрдб рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдВ рд░рд╣рддрд╛ рд╣реИ ред

12. рд╕реНрдХреЗрд▓реЗрдмрд▓ рдиреЛрдбреНрд╕


рдареАрдХ рд╣реИ, рдЪреМрдереЗ рднрд╛рдЧ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЦрд┐рд░реА рдЫреЛрдЯреА рдЪреАрдЬ рдЬреЛрдбрд╝реЗрдВред рдкрд╛рда рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЛрдбреНрд╕ рд╕реНрдХреЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЯреЗрдХреНрд╕реНрдЯ рдиреЛрдб рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджреЗрдВрдЧреЗ:
  def Render(self, gc): textDimensions = gc.GetTextExtent(self.text) self.boundingBoxDimensions = [textDimensions[0]+20, textDimensions[1]+20] super(SimpleTextBoxNode, self).Render(gc) gc.DrawText(self.text, self.position[0]+10, self.position[1]+10) 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ GetTextExtent рд╡рд┐рдзрд┐ рдЙрд╕ рдЖрдпрдд рдХрд╛ рдЖрдХрд╛рд░ рд▓реМрдЯрд╛рддреА рд╣реИ рдЬрд┐рд╕ рдкрд░ рдкрд╛рда рд╡реНрдпрд╛рдкреНрдд рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдПрдХ рдиреЛрдб рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рддрд░рдл рдкрд╛рда рд╕реЗ 10 рдкрд┐рдХреНрд╕реЗрд▓ рдмрдбрд╝рд╛ рд╣реЛред рдЕрдм рдпрд╣ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ:


рдХреЛрдб GitHub рдкрд░ рдЗрд╕ рдкреНрд░рддрд┐рдмрджреНрдз рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ ред

рдкреБрдирд╢реНрдЪ: рдЯрд╛рдЗрдкреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдореЗрдВ рд▓рд┐рдЦреЗрдВред

Source: https://habr.com/ru/post/In201784/


All Articles