wxpython入门第八步(画图)

wxPython graphics

GDI(Graphics Device Interface,图形设备接口)是一个与图形工作的接口,用于与显示器、打印机或文件等图形设备交互。它用于与显示器、打印机或文件等图形设备进行交互。GDI允许程序员在屏幕或打印机上显示数据,而不必关注特定设备的细节。GDI将程序员与硬件隔离开来。

从程序员的角度来看,GDI是一组用于处理图形的类和方法。GDI由二维矢量图形、字体和图像组成。

The GDI

要开始绘制图形,我们必须创建一个设备上下文DC)对象。在 wxPython 中,设备上下文被称为 wx.DC。文档中把wx.DC定义为一个可以绘制图形和文本的设备上下文。它以一种通用的方式表示设备的数量。同一段代码可以写到不同类型的设备上。无论是屏幕还是打印机。wx.DC不是用来直接使用的。相反,程序员应该选择一个派生类。每个派生类都是为了在特定条件下使用。

派生 wx.DC 类

  • wxBufferedDC
  • wxBufferedPaintDC
  • wxPostScriptDC
  • wxMemoryDC
  • wxPrinterDC
  • wxScreenDC
  • wxClientDC
  • wxPaintDC
  • wxWindowDC

wx.ScreenDC用于在屏幕上的任何地方绘画。wx.WindowDC用于在整个窗口上作画(仅限Windows)。这包括窗口装饰。wx.ClientDC用于在窗口的客户端区域绘制。客户端区域是指没有装饰的窗口区域(标题和边框)。wx.PaintDC也用于在客户端区域进行绘制。但是wx.PaintDCwx.ClientDC之间有一个区别。wx.PaintDC只能在wx.PaintEvent中使用。wx.ClientDC不应该在wx.PaintEvent中使用。wx.MemoryDC用于在位图上绘制图形。wx.PostScriptDC用于在任何平台上写入PostScript文件。wx.PrinterDC用于访问打印机(仅限Windows)。

画线

我们的第一个例子将在窗口的客户端区域画一条简单的线。

DrawLine(self, x1, y1, x2, y2)

这种方法是从第一点到第二点画一条线;不包括第二点。

#draw_line.py

import wx

class Example(wx.Frame):

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

        self.InitUI()

    def InitUI(self):

        wx.CallLater(2000, self.DrawLine)

        self.SetTitle("Line")
        self.Centre()

    def DrawLine(self):

        dc = wx.ClientDC(self)
        dc.DrawLine(50, 60, 190, 60)

def main():

    app = wx.App()
    ex = Example(None)
    ex.Show()
    app.MainLoop()


if __name__ == '__main__':
    main()

两秒过后,我们在框架窗口上画一条线。

wx.CallLater(2000, self.DrawLine)

我们在窗口创建后调用DrawLine()方法。我们这样做是因为,当窗口创建时,它就被绘制了。因此,我们所有的绘图都将丢失。我们可以在窗口被创建后再开始绘制。这就是为什么我们调用wx.CallLater()方法的原因。

def DrawLine(self):

    dc = wx.ClientDC(self)
    dc.DrawLine(50, 60, 190, 60)

我们创建一个wx.ClientDC设备上下文。唯一的参数是我们要绘制的窗口。在我们的例子中,它是self,是对wx.Frame widget的引用。我们调用设备上下文的DrawLine()方法。这个调用实际上是在我们的窗口上画一条线。

理解以下行为是非常重要的。如果我们调整窗口的大小,这条线就会消失。为什么会出现这种情况?如果调整窗口的大小,每个窗口都会被重新绘制。如果它被最大化,它也会被重新绘制。如果我们用另一个窗口覆盖窗口,然后再揭开,窗口也会被重新绘制。窗口被绘制到默认状态,我们的线就会丢失。每次调整窗口的大小时,我们都必须画线。解决方法是wx.PaintEvent。每次窗口被重新绘制时,这个事件都会被触发。我们将在一个与paint事件挂钩的方法中画线。

下面的例子展示了如何完成。

#draw_line2.py

import wx

class Example(wx.Frame):

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

        self.InitUI()

    def InitUI(self):

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

        self.SetTitle("Line")
        self.Centre()

    def OnPaint(self, e):

        dc = wx.PaintDC(self)
        dc.DrawLine(50, 60, 190, 60)


def main():

    app = wx.App()
    ex = Example(None)
    ex.Show()
    app.MainLoop()


if __name__ == '__main__':
    main()

我们画的是同一条线。这一次是对paint事件的反应。

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

这里我们将OnPaint方法绑定到wx.PaintEvent事件。这意味着每次我们的窗口被重新绘制时,我们调用OnPaint()方法。现在,如果我们调整窗口的大小(覆盖它,最大化它),这条线不会消失。

dc = wx.PaintDC(self)

请注意,这次我们使用了wx.PaintDC

image-20201101102113582

计算机图形

有两种不同的计算机图形。矢量和光栅图形。栅格图形以像素的集合来表示图像。矢量图形是使用几何基元,如点、线、曲线或多边形来表示图像。这些基元是使用数学公式创建的。

两种类型的计算机图形都有优点和缺点。与光栅相比,矢量图形的优点是:

  • 尺寸较小
  • 可无限放大
  • 移动、缩放、填充或旋转不会降低图像的质量。

以下是部分图形的列表。

  • points
  • lines
  • polylines
  • polygons
  • circles
  • ellipses
  • splines

属性

包含几个属性,如Brush、Pen或Font。wx.Brush是一个用于填充区域的绘画工具。它用于绘制形状的背景。它有一个颜色和一个样式。wx.Pen用于绘制形状的轮廓。它有一个颜色,一个宽度和一个样式。wx.Font是一个决定文本外观的对象。

基本对象

在下面的行文中,我们将介绍几个基本的对象:颜色、笔刷、笔、连接、帽和渐变。

颜色

颜色是代表红、绿、蓝(RGB)强度值组合的对象。有效的RGB值的范围是0到255。有三种方法可以设置颜色。我们可以创建一个wx.Colour对象,使用一个预定义的颜色名称或使用十六进制值字符串。wx.Colour(0,0,255)'BLUE''#0000FF'。这三种符号产生相同的颜色。

我们有一个预定义的颜色名称列表,我们可以在程序中使用。

AQUAMARINE BLACK BLUE BLUE VIOLET BROWN
CADET BLUE CORAL CORNFLOWER BLUE CYAN DARK GREY
DARK GREEN DARK OLIVE GREEN DARK ORCHID DARK SLATE BLUE DARK SLATE GREY
DARK TURQUOISE DIM GREY FIREBRICK FOREST GREEN GOLD
GOLDENROD GREY GREEN GREEN YELLOW INDIAN RED
KHAKI LIGHT BLUE LIGHT GREY LIGHT STEEL BLUE LIME GREEN
MAGENTA MAROON MEDIUM AQUAMARINE MEDIUM BLUE MEDIUM FOREST GREEN
MEDIUM GOLDENROD MEDIUM ORCHID MEDIUM SEA GREEN MEDIUM SLATE BLUE MEDIUM SPRING GREEN
MEDIUM TURQUOISE MEDIUM VIOLET RED MIDNIGHT BLUE NAVY ORANGE
ORANGE RED ORCHID PALE GREEN PINK PLUM
PURPLE RED SALMON SEA GREEN SIENNA
SKY BLUE SLATE BLUE SPRING GREEN STEEL BLUE TAN
THISTLE TURQUOISE VIOLET VIOLET RED WHEAT
WHITE YELLOW YELLOW GREEN

下面的例子使用了一些颜色值。

#colours.py

import wx

class Example(wx.Frame):

    d
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值