wxPython - GDI基本元素之画笔Pen

实战wxPython系列-057

wx.Pen是一个基本的图形对象。用于绘制矩形、椭圆、多边形或其他形状的直线、曲线和轮廓。

一、wx.Pen简介

画笔具有样式、宽度、画刷、笔帽样式和连接样式等属性。画笔的样式Style定义了线的样式。笔帽样式Cap定义了使用wx.PaintDC绘制的线的末端;连接样式Join则定义了两条线如何连接起来。画笔宽度Width定义了画笔的宽。

wx.Pen的常用方法

  • GetCap(self):返回笔帽样式,可以是CAP_ROUND, cap_projection和CAP_BUTT之一。默认值是CAP_ROUND。
  • GetColour(self):返回画笔的颜色。
  • GetJoin(self):返回画笔连接样式,可以是JOIN_BEVEL, JOIN_ROUND和JOIN_MITER之一。默认值是JOIN_ROUND。
  • GetStyle(self):返回画笔线条样式。
  • GetWidth(self):返回画笔宽度。
  • SetCap(self, capStyle):设置笔帽样式,可以是CAP_ROUND, cap_projection和CAP_BUTT之一。默认值是CAP_ROUND。
  • SetColour (self, colour):设置画笔的颜色。
  • SetJoin(self, join_style):设置画笔连接样式,可以是JOIN_BEVEL, JOIN_ROUND和JOIN_MITER之一。默认值是JOIN_ROUND。
  • SetStyle(self, style):设置画笔线条样式。
  • SetWidth(self, width):设置画笔宽度。

二、wx.Pen线条样式

画笔支持多种线条样式:

  • wx.PENSTYLE_SOLID:平滑实线
  • wx.PENSTYLE_DOT:点虚线
  • wx.PENSTYLE_LONG_DASH:长虚线
  • wx.PENSTYLE_SHORT_DASH:短虚线。
  • wx.PENSTYLE_DOT_DASH:短线和点间隔的虚线。
  • wx.PENSTYLE_USER_DASH:用户自定义的虚线样式。
  • wx.PENSTYLE_TRANSPARENT:透明,实际上没有线。

图1:wx.Pen线条样式示意图

#画笔(wx.Pen)

import wx

class SamplePen(wx.Frame):

    def __init__(self, *args, **kw):
        super(SamplePen, self).__init__(*args, **kw)

        self.InitUi()

    def InitUi(self):
        self.SetTitle("实战wxPython: GDI-画笔")
        self.SetSize(400, 240)

        self.Bind(wx.EVT_PAINT, self.OnPaint)

        self.Centre()

    def OnPaint(self, e):
        dc = wx.PaintDC(self)

        dc.SetPen(wx.Pen('#4c4c4c', 1, wx.PENSTYLE_SOLID))
        dc.DrawRectangle(30, 15, 90, 60)

        dc.SetPen(wx.Pen('#4c4c4c', 1, wx.PENSTYLE_DOT))
        dc.DrawRectangle(150, 15, 90, 60)

        dc.SetPen(wx.Pen('#4c4c4c', 1, wx.PENSTYLE_LONG_DASH))
        dc.DrawRectangle(270, 15, 90, 60)

        dc.SetPen(wx.Pen('#4c4c4c', 1, wx.PENSTYLE_SHORT_DASH))
        dc.DrawRectangle(30, 105, 90, 60)

        dc.SetPen(wx.Pen('#4c4c4c', 1, wx.PENSTYLE_DOT_DASH))
        dc.DrawRectangle(150, 105, 90, 60)

        dc.SetPen(wx.Pen('#4c4c4c', 1, wx.PENSTYLE_TRANSPARENT))
        dc.DrawRectangle(270, 105, 90, 60)

def main():
    app = wx.App()
    sample = SamplePen(None)
    sample.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()

上面的示例演示了几种画笔样式。

图2:wx.Pen画笔样式演示

三、连接(Join)和笔帽(Cap)样式

画笔还有两个附加样式参数,连接(join)样式和笔帽(cap)样式。连接样式定义了两条线连接时的样式,样式仅适用于宽线的情况(即线宽大于等于1的时候)。

连接(join)样式有以下几种:

  • wx.JOIN_MITER。
  • wx.JOIN_BEVEL。
  • wx.JOIN_ROUND。

当使用wx.JOIN_MITER时,线的外缘被扩展。它们以一个角度相遇,这个区域被填满。在wx.JOIN_BEVEL中,两条线之间的三角形缺口被填充。在wx.JOIN_ROUND中,两条线之间的圆弧被填充。可以参考下面图示来理解这几种连接样式的细节。

图3:连接样式示意图

笔帽(cap)样式有以下几种:

  • wx.CAP_ROUND
  • wx.CAP_PROJECTING
  • wx.CAP_BUTT

wx.CAP_ROUND绘制圆的结尾。wx.CAP_PROJECTING和wx.CAP_BUTT绘制正方形末端。它们之间的区别是wx.CAP_PROJECTING将扩展到超出终点的一半行长。wx.CAP_ROUND也将扩展到端点之外。可以参考下面图示来理解这几种笔帽样式的细节。

图4:笔帽样式示意图

#画笔(wx.Pen)

import wx
import math

class SampleJoinsCaps(wx.Frame):

    def __init__(self, *args, **kw):
        super(SampleJoinsCaps, self).__init__(*args, **kw)

        self.InitUi()

    def InitUi(self):
        self.SetTitle("实战wxPython: GDI-笔帽和连接样式")
        self.SetSize(400, 300)

        self.Bind(wx.EVT_PAINT, self.OnPaint)

        self.Centre()

    def OnPaint(self, e):
        dc = wx.PaintDC(self)

        pen = wx.Pen('#4c4c4c', 10, wx.SOLID)
        
        pen.SetJoin(wx.JOIN_MITER)
        dc.SetPen(pen)
        self.DrawPentagram(dc, 60, 60)

        pen.SetJoin(wx.JOIN_BEVEL)
        dc.SetPen(pen)
        self.DrawPentagram(dc, 180, 60)

        pen.SetJoin(wx.JOIN_ROUND)
        dc.SetPen(pen)
        self.DrawPentagram(dc, 300, 60)

        pen.SetCap(wx.CAP_BUTT)
        dc.SetPen(pen)
        dc.DrawLine(30, 150,  150, 150)

        pen.SetCap(wx.CAP_PROJECTING)
        dc.SetPen(pen)
        dc.DrawLine(30, 190,  150, 190)

        pen.SetCap(wx.CAP_ROUND)
        dc.SetPen(pen)
        dc.DrawLine(30, 230,  150, 230)

        pen2 = wx.Pen('#4c4c4c', 1, wx.SOLID)
        dc.SetPen(pen2)
        dc.DrawLine(30, 130, 30, 250)
        dc.DrawLine(150, 130, 150, 250)
        dc.DrawLine(155, 130, 155, 250)

    def DrawPentagram(self, dc, pos_x, pos_y):
        #绘制五角星
        #添加一个多边形(五角星)
        #外点:x=Rcos(72°*k)  y=Rsin(72°*k)   k=0,1,2,3,4
        #内点:r=Rsin18°/sin36°  x=rcos(72°*k+36°)  y=rsin(72°*k+36°)   k=0,1,2,3,4
        deg_18 = 18 * math.pi / 180
        deg_36 = 36 * math.pi / 180
        deg_72 = 72 * math.pi / 180
        r_out = 50 #半径
        r_inner = r_out * math.sin(deg_18) / math.sin(deg_36)
        polygon_points = []
        for i in range(5):
            #外点
            out_angle = deg_72 * i - deg_18
            polygon_points.append(wx.Point(r_out * math.cos(out_angle), r_out * math.sin(out_angle)))
            #外点
            in_angle =  deg_72 * i + deg_18
            polygon_points.append(wx.Point(r_inner * math.cos(in_angle), r_inner * math.sin(in_angle)))

        dc.DrawPolygon(polygon_points, pos_x, pos_y)

def main():
    app = wx.App()
    sample = SampleJoinsCaps(None)
    sample.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()

上面的代码,绘制三个五角星演示三种不同的笔帽效果,窗口下半部分则展示了连接样式的区别。

图5:Cap和Join效果演示

四、本文知识点

  • 了解画笔wx.Pen的基本用法。
  • 了解和使用画笔的样式。
  • 了解和使用画笔的连接和笔帽样式。

前一篇:wxPython - GDI基本元素之颜色Colour

欢迎关注,评论,收藏,点赞,和转发。

举报
评论 0