wxPython graphics
GDI(Graphics Device Interface,图形设备接口)是一个与图形工作的接口,用于与显示器、打印机或文件等图形设备交互。它用于与显示器、打印机或文件等图形设备进行交互。GDI允许程序员在屏幕或打印机上显示数据,而不必关注特定设备的细节。GDI将程序员与硬件隔离开来。
从程序员的角度来看,GDI是一组用于处理图形的类和方法。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.PaintDC
和wx.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
。

计算机图形
有两种不同的计算机图形。矢量和光栅图形。栅格图形以像素的集合来表示图像。矢量图形是使用几何基元,如点、线、曲线或多边形来表示图像。这些基元是使用数学公式创建的。
两种类型的计算机图形都有优点和缺点。与光栅相比,矢量图形的优点是:
- 尺寸较小
- 可无限放大
- 移动、缩放、填充或旋转不会降低图像的质量。
以下是部分图形的列表。
- 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