- PyGTK 教程
- PyGTK - 主页
- PyGTK - 简介
- PyGTK - 环境
- PyGTK - 你好世界
- PyGTK - 重要类
- PyGTK - 窗口类
- PyGTK - 按钮类
- PyGTK - 标签类
- PyGTK - 入门级
- PyGTK - 信号处理
- PyGTK - 事件处理
- PyGTK - 容器
- PyGTK - 盒子类
- PyGTK - ButtonBox 类
- PyGTK - 对齐类
- PyGTK - EventBox 类
- PyGTK - 布局类
- PyGTK - 组合框类
- PyGTK - ToggleButton 类
- PyGTK - CheckButton 类
- PyGTK - 单选按钮类
- PyGTK - 菜单栏、菜单和菜单项
- PyGTK - 工具栏类
- PyGTK - 调整类
- PyGTK - 范围类
- PyGTK - 规模类
- PyGTK - 滚动条类
- PyGTK - 对话框类
- PyGTK - 消息对话框类
- PyGTK - AboutDialog 类
- PyGTK - 字体选择对话框
- PyGTK - 颜色选择对话框
- PyGTK - 文件选择器对话框
- PyGTK - 笔记本类
- PyGTK - 框架类
- PyGTK - AspectFrame 类
- PyGTK - TreeView 类
- PyGTK - 窗格类
- PyGTK - 状态栏类
- PyGTK - ProgressBar 类
- PyGTK - 视口类
- PyGTK - 滚动窗口类
- PyGTK - 箭头类
- PyGTK - 图像类
- PyGTK - DrawingArea 类
- PyGTK - SpinButton 类
- PyGTK - 日历类
- PyGTK - 剪贴板类
- PyGTK - 标尺类
- PyGTK - 超时
- PyGTK - 拖放
- PyGTK 有用资源
- PyGTK - 快速指南
- PyGTK - 有用的资源
- PyGTK - 讨论
PyGTK - DrawingArea 类
DrawingArea 小部件呈现一个包含 gtk.gdk.Window 的空白画布,可以在其中绘制直线、矩形、圆弧等对象。
PyGTK 使用 Cairo 库进行此类绘图操作。Cairo 是一个流行的 2D 矢量图形库。它是用 C 编写的,尽管它绑定了大多数语言,例如 C++、Java、Python、PHP 等。Cairo 库可用于在各种操作系统中的标准输出设备上绘图。它还可用于创建 PDF、SVG 和后期脚本文件。
为了执行不同的绘图操作,我们必须在目标输出对象的文本上获取设备。在这种情况下,由于绘图出现在 gtk.DrawingArea 小部件上,因此获得了其中包含的 gdk.Window 的设备上下文。此类有一个cairo-create()方法,该方法返回设备上下文。
area = gtk.DrawingArea() dc = area.window.cairo_create()
DrawingArea 小部件可以根据它发出的以下信号连接到回调 -
意识到 | 当小部件在特定显示器上实例化时采取任何必要的操作。 |
配置事件 | 当小部件更改大小时采取任何必要的操作。 |
暴露事件 | 当绘图区域首次出现在屏幕上或被另一个窗口覆盖然后未被覆盖(暴露)时,处理重新绘制小部件的内容。 |
鼠标和键盘事件也可用于通过gtk.Widget 类的add_events() 方法调用回调。
特别令人感兴趣的是当 DrawingArea 画布首次出现时发出的暴露事件信号。Cairo 库中定义的用于绘制 2D 对象的不同方法是从此连接到暴露事件信号的回调调用的。这些方法在 Cairo 设备上下文上绘制相应的对象。
以下是可用的绘图方法 -
dc.rectangle(x,y,w,h) - 在指定的左上角坐标处绘制一个矩形,并具有给定的宽度和高度。
dc.arc(x,y,r,a1,a2) - 绘制具有给定半径和两个角度的圆弧。
dc.line(x1, y1, x2, y2) - 在两对坐标之间绘制一条线。
dc.line_to(x,y) - 从当前位置到 (x,y) 绘制一条线
dc.show_text(str) - 在当前光标位置绘制字符串
dc.lines() - 绘制轮廓
dc.fill() - 用当前颜色填充形状
dc.set_color_rgb(r,g,b) - 将颜色设置为轮廓并用 0.0 到 1.0 之间的 r、g 和 b 值填充
例子
以下脚本绘制不同的形状并使用 Cairo 方法进行测试。
import gtk import math class PyApp(gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title("Basic shapes using Cairo") self.set_size_request(400, 250) self.set_position(gtk.WIN_POS_CENTER) self.connect("destroy", gtk.main_quit) darea = gtk.DrawingArea() darea.connect("expose-event", self.expose) self.add(darea) self.show_all() def expose(self, widget, event): cr = widget.window.cairo_create() cr.set_line_width(2) cr.set_source_rgb(0,0,1) cr.rectangle(10,10,100,100) cr.stroke() cr.set_source_rgb(1,0,0) cr.rectangle(10,125,100,100) cr.stroke() cr.set_source_rgb(0,1,0) cr.rectangle(125,10,100,100) cr.fill() cr.set_source_rgb(0.5,0.6,0.7) cr.rectangle(125,125,100,100) cr.fill() cr.arc(300, 50, 50,0, 2*math.pi) cr.set_source_rgb(0.2,0.2,0.2) cr.fill() cr.arc(300, 200, 50, math.pi,0) cr.set_source_rgb(0.1,0.1,0.1) cr.stroke() cr.move_to(50,240) cr.show_text("Hello PyGTK") cr.move_to(150,240) cr.line_to(400,240) cr.stroke() PyApp() gtk.main()
上面的脚本将生成以下输出 -