1

私は長い間、Python で引数を処理する方法を理解しようとしています。また、名前のスコープ規則によって、苦労することもあります。私はSVG + Javascriptを扱っていますが、これは非常に扱いが簡単で、例を説明するためにJSでいくつかの重要なコードを書きました.Pythonについて読んでも私の愚かさは解決しませんでした. これは、以下のコードの動作を確認できるリンクです。とても簡単。

<svg id="svgRoot" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect id="background" x="1%" y="2%" width="98%" height="97%" fill="khaki" onmousedown="takePos(evt)" />
<script type="text/ecmascript">
<![CDATA[
var x1, x2;
var Root=document.documentElement;

function takePos(evt){
  x1=evt.clientX;
  y1=evt.clientY;
  var w=0;
  var h=0;
  Root.setAttributeNS(null, "onmousemove", "mouseMove(evt)");
  Root.setAttributeNS(null, "onmouseup", "endPos()");
  buildRect(w, h);
}
function mouseMove(evt){
  var w=evt.clientX-x1;
  var h=evt.clientY-y1;
  var r=document.getElementById("svgRoot").lastChild;
  if ((w>0)&&(h>0)) {
    r.setAttributeNS(null, "width", w);
    r.setAttributeNS(null, "height", h);
  }
}
function endPos(){
  Root.setAttributeNS(null, "onmousemove", null);
  Root.setAttributeNS(null, "onmouseup", null);
}
function buildRect(w, h){
  var cont=document.getElementById("svgRoot");
  var r=document.createElementNS("http://www.w3.org/2000/svg", "rect");
  r.setAttributeNS(null, "id", "svgR");
  r.setAttributeNS(null, "x", x1);
  r.setAttributeNS(null, "y", y1);
  r.setAttributeNS(null, "width", w);
  r.setAttributeNS(null, "height", h);
  r.setAttributeNS(null, "rx", "10");
  r.setAttributeNS(null, "fill", "darkblue");
  r.setAttributeNS(null, "fill-opacity", "0.5");
  cont.appendChild(r);
}
]]>
</script>

</svg>

最も単純なマウス描画の四角形。そして今、以下はwx.Pythonでそのようなものを書こうとするタイタニックの試みです。

#   HOW TO DRAW RECTANGLE AS IN MY SVG-EXAMPLE ?

import wx

class MyPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, wx.ID_ANY)
        self.SetBackgroundColour('white')
        self.Bind(wx.EVT_LEFT_DOWN, self.onDown)
        self.Bind(wx.EVT_MOTION, self.onMove)
        self.Bind(wx.EVT_LEFT_UP, self.onUp)

    def onDown(self, evt):
        pt1 = evt.GetPosition() # firstPosition tuple
        w = pt1.x   # starting with zero width and height
        h = pt1.y
        self.drawRect(pt1, w, h)    #??? args

    def onMove(self, evt):
        pt2 = evt.GetPosition() 
        w = pt2.x - pt1.x
        h = pt2.y - pt1.y
        # should to append new width and height while moving

    def onUp(self):
        #  had to finish drawing

    def drawRect(self, pt1, w, h):
        pdc = wx.PaintDC(self)
        try:
            # needed to give realistic transparency 
            dc = wx.GCDC(pdc)
        except:
            # wx.PaintDC alone will not give transparency
            dc = pdc
        r, g, b = (30, 140, 220)
        pencolour = wx.Colour(r, g, b, 180)
        brushcolour = wx.Colour(r, g, b, 120)
        dc.SetPen(wx.Pen(pencolour))
        dc.SetBrush(wx.Brush(brushcolour))
        rect = wx.Rect(pt1, w, h)
        dc.DrawRoundedRectangleRect(rect, 8)




app = wx.App(0)
caption = "wx.GCDC() is here to achieve transparency"
frame = wx.Frame(None, wx.ID_ANY, caption, size=(400, 310))
MyPanel(frame)
frame.Show(True)
app.MainLoop()

wx.Python でジョブを実行する方法については、Javascript コードを参照してください。私はすでにインターネットや本から例を読もうとしました。Python のその他のことは、非常に単純で論理的であり、面倒なことはまったくありません。

4

1 に答える 1

2

クラス ( MyPanel) を使用しているため、四角形/データをクラス メンバーに格納する必要があります ( を使用self)。

例 (未テストですが、アイデアはわかります):

def __init__(self, ...)
    ...
    self.pt1 = None
    self.pt2 = None
    self.rects = []

def onDown(self, evt):
    self.pt1 = evt.GetPosition() # new start position

def onMove(self, evt):
    self.pt2 = evt.GetPosition() # end position

def onUp(self, evt):
    # if mouse is released, store the points in the list
    self.rects.append((self.pt1, self.pt2))
    self.pt1 = self.pt2 = None

def onDraw(self, evt):
    dc = wx.PaintDC(self)

    # if we are currently creating a new rect, draw it
    if self.pt1 and self.pt2:
        self.drawRect(dc, self.pt1, self.pt2)

    # draw all finished rects
    for p1, p2 in self.rects:
        self.drawRect(dc, p1, p2)
于 2012-07-03T09:12:32.173 に答える