wxpython 之 GDI(二)

來源:互聯網
上載者:User
文章目錄
  • Basic primitives
Basic primitivesPoint

最簡單的幾何對象是一個點。它是一個視窗上平面的點。

DrawPoint(int x, int y)
#!/usr/bin/python# -*- coding: utf-8 -*-import wximport randomclass Points(wx.Frame):    def __init__(self, parent, id = -1, title = 'points club'):        wx.Frame.__init__(self, parent, id, title, size=(250, 150))        self.Bind(wx.EVT_PAINT, self.OnPaint)        self.Centre()        self.Show(True)    def OnPaint(self, event):        dc = wx.PaintDC(self)        dc.SetPen(wx.Pen('RED'))        for i in range(1000):            w, h = self.GetSize()            x = random.randint(1, w-1)            y = random.randint(1, h-1)            dc.DrawPoint(x, y)                       if __name__ == '__main__':    app = wx.App()    Points(None)    app.MainLoop()
Shapes

形狀是更複雜的幾何對象。我們將在下面的樣本繪製各種幾何形狀。

#!/usr/bin/python# -*- coding: utf-8 -*-import wxclass Shapes(wx.Frame):    def __init__(self, parent, id = -1, title = 'Shapes'):        wx.Frame.__init__(self, parent, id, title, size=(350, 300))        self.Bind(wx.EVT_PAINT, self.OnPaint)        self.Centre()        self.Show(True)    def OnPaint(self, event):        dc = wx.PaintDC(self)        dc.DrawEllipse(20, 20, 90, 60)        dc.DrawRoundedRectangle(130, 20, 90, 60, 10)        dc.DrawArc(240, 40, 340, 40, 290, 20)        dc.DrawPolygon(((130, 140), (180, 170), (180, 140), (220, 110), (140, 100)))        dc.DrawRectangle(20, 120, 80, 50)        dc.DrawSpline(((240, 170), (280, 170), (285, 110), (325, 110)))        dc.DrawLines(((20, 260), (100, 260), (20, 210), (100, 210)))        dc.DrawCircle(170, 230, 35)        dc.DrawRectangle(250, 200, 60, 60)               if __name__ == '__main__':    app = wx.App()    Shapes(None)    app.MainLoop()

 

Regions

裝置上下文可以分為幾個部分,稱為地區。地區可以是任何形狀。地區可以是一個簡單的矩形或圓形。與合并、 相交、 相減和 Xor 操作我們可以從簡單的建立複雜的地區。地區用於大綱顯示、 填充或剪輯。

我們可以通過三種方式來建立地區。最簡單的方法是建立一個矩形地區。可以從位元影像的點列表建立更複雜的地區。

wx.Region(int x=0, int y=0, int width=0, int height=0)
wx.RegionFromPoints(list points, int fillStyle=wx.WINDING_RULE)

 

 此建構函式建立一個多邊形地區。FillStyle 參數可以是 wx.WINDING_RULE 或 wx.ODDEVEN_RULE。

可以用下面的類建立更複雜的地區

wx.RegionFromBitmap(wx.Bitmap bmp)

在我們學習地區之前,我們將首先建立一個小例子。我們劃分主題分成幾個部分,以便更容易理解。您可能會發現它將很好的用到了你在學校裡學習到的數學知識。
import wxfrom math import hypot, sin, cos, piclass Example(wx.Frame):    def __init__(self, *args, **kw):        super(Example, self).__init__(*args, **kw)         self.Bind(wx.EVT_PAINT, self.OnPaint)        self.SetSize((350, 250))        self.SetTitle('Lines')        self.Centre()        self.Show(True)    def OnPaint(self, event):              dc = wx.PaintDC(self)        size_x, size_y = self.GetClientSizeTuple()        dc.SetDeviceOrigin(size_x/2, size_y/2)        radius = hypot(size_x/2, size_y/2)        angle = 0        while (angle < 2*pi):            x = radius*cos(angle)            y = radius*sin(angle)            dc.DrawLinePoint((0, 0), (x, y))            angle = angle + 2*pi/360        if __name__ == '__main__':    app = wx.App()    Example(None, -1, 'xxx')    app.MainLoop()

 

之隔例子中,我們從用戶端區域中心點向外圍畫了260條線。線之間偏一度。

方法 SetDeviceOrigin() 建立一個新的開始的座標系統。我們把它放到用戶端地區的中間。通過重新置放座標系統,我們使我們的繪圖較不複雜。

 

Clipping修剪是用來限制在某一特定地區繪圖。在兩種情況下使用剪輯。要建立效果,以提高應用程式的效能。我們用 SetClippingRegionAsRegion() 方法限制到某一地區的繪圖。

 下面的樣本中我們將修改和加強我們先前的例子。

 

#!/usr/bin/python# -*- coding: utf-8 -*-import wxfrom math import hypot, sin, cos, piclass Example(wx.Frame):    def __init__(self, parent, id, title):        wx.Frame.__init__(self, parent, id, title, size=(350, 300))        self.Bind(wx.EVT_PAINT, self.OnPaint)        self.Centre()        self.Show(True)    def OnPaint(self, event):        dc = wx.PaintDC(self)        dc.SetPen(wx.Pen('#424242'))        size_x, size_y = self.GetClientSizeTuple()        dc.SetDeviceOrigin(size_x/2, size_y/2)        points = (((0, 85), (75, 75), (100, 10), (125, 75), (200, 85),            (150, 125), (160, 190), (100, 150), (40, 190), (50, 125)))        region = wx.RegionFromPoints(points)        dc.SetClippingRegionAsRegion(region)        radius = hypot(size_x/2, size_y/2)        angle = 0        while (angle < 2*pi):            x = radius*cos(angle)            y = radius*sin(angle)            dc.DrawLinePoint((0, 0), (x, y))            angle = angle + 2*pi/360        dc.DestroyClippingRegion()        if __name__ == '__main__':    app = wx.App()    Example(None, -1, 'xxx')    app.MainLoop()

 

 我們依然畫了360條線,但是這次之在一個特定的地區畫。這個特定的地區是用points集合產生的regin地區。

region = wx.RegionFromPoints(points)dc.SetClippingRegionAsRegion(region)

 

我們用wx.RegionFromPoins()及points集合建立一個地區。SetClippingRegionAsRegion()方法設定繪畫的地區。
dc.DestroyClippingRegion()

 

clipregion使用完後,我們必須destory it。
 

Operations over Regions

Regions可以組合成更複雜的形狀。我們可以使用4類運算。合并,相交,相減 xor 運算。

下面的例子示範了這四種運算。

#!/usr/bin/python# -*- coding: utf-8 -*-import wxfrom math import hypot, sin, cos, piclass Example(wx.Frame):     def __init__(self, parent, id, title):         wx.Frame.__init__(self, parent, id, title, size=(270, 220))         self.Bind(wx.EVT_PAINT, self.OnPaint)         self.Centre()         self.Show(True)     def OnPaint(self, event):         dc = wx.PaintDC(self)         dc.SetPen(wx.Pen('#d4d4d4'))                  #First         dc.DrawRectangle(20, 20, 50, 50)         dc.DrawRectangle(30, 40, 50, 50)         #Second         dc.SetBrush(wx.Brush('#ffffff'))         dc.DrawRectangle(100, 20, 50, 50)         dc.DrawRectangle(110, 40, 50, 50)          region1 = wx.Region(100, 20, 50, 50)         region2 = wx.Region(110, 40, 50, 50)         region1.IntersectRegion(region2)         rect = region1.GetBox()         dc.SetClippingRegionAsRegion(region1)         dc.SetBrush(wx.Brush('#ff0000'))         dc.DrawRectangleRect(rect)         dc.DestroyClippingRegion()         # 3         dc.SetBrush(wx.Brush('#ffffff'))         dc.DrawRectangle(180, 20, 50, 50)         dc.DrawRectangle(190, 40, 50, 50)         region1 = wx.Region(180, 20, 50, 50)         region2 = wx.Region(190, 40, 50, 50)         region1.UnionRegion(region2)         dc.SetClippingRegionAsRegion(region1)         rect = region1.GetBox()         dc.SetBrush(wx.Brush('#fa8e00'))         dc.DrawRectangleRect(rect)         dc.DestroyClippingRegion()                  #4         dc.SetBrush(wx.Brush('#ffffff'))         dc.DrawRectangle(20, 120, 50, 50)         dc.DrawRectangle(30, 140, 50, 50)         region1 = wx.Region(20, 120, 50, 50)         region2 = wx.Region(30, 140, 50, 50)         region1.XorRegion(region2)         rect = region1.GetBox()         dc.SetClippingRegionAsRegion(region1)         dc.SetBrush(wx.Brush('#619e1b'))         dc.DrawRectangleRect(rect)         dc.DestroyClippingRegion()                  #5         dc.SetBrush(wx.Brush('#ffffff'))         dc.DrawRectangle(100, 120, 50, 50)         dc.DrawRectangle(110, 140, 50, 50)         region1 = wx.Region(100, 120, 50, 50)         region2 = wx.Region(110, 140, 50, 50)         region1.SubtractRegion(region2)         rect = region1.GetBox()         dc.SetClippingRegionAsRegion(region1)         dc.SetBrush(wx.Brush('#715b33'))         dc.DrawRectangleRect(rect)         dc.DestroyClippingRegion()         #6         dc.SetBrush(wx.Brush('#ffffff'))         dc.DrawRectangle(180, 120, 50, 50)         dc.DrawRectangle(190, 140, 50, 50)         region1 = wx.Region(180, 120, 50, 50)         region2 = wx.Region(190, 140, 50, 50)         region2.SubtractRegion(region1)         rect = region2.GetBox()         dc.SetClippingRegionAsRegion(region2)         dc.SetBrush(wx.Brush('#0d0060'))         dc.DrawRectangleRect(rect)         dc.DestroyClippingRegion()        if __name__ == '__main__':    app = wx.App()    Example(None, -1, 'xxx')    app.MainLoop()
Mapping modes

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.