《wxPython实战(中文版).pdf》由会员分享,可在线阅读,更多相关《wxPython实战(中文版).pdf(565页珍藏版)》请在三一文库上搜索。
1、wxPython in Action 译文 1 / 565 本书由 H a r r i Pa s a n e n 和 Ro b i n D u n n 所著 由 滴水(w w w . p y t h o n t i k . c o m )翻译 由 l a . o n g e r ( l a -o n g e r . l o n g -e r . n a m e ) 整理成p d f 版本 Part1 wxPython入门 19 1. 欢迎来到wxPython 19 1.1 开始wxPython 20 1.2 创建最小的空的wxPython程序 20 1.2.1 导入wxPython 21 1.
2、2.2 使用应用程序和框架工作 22 子类化wxPython application类 23 定义一个应用程序的初始化方法 23 创建一个应用程序实例并进入它的主事件循环 23 1.3 扩展这个最小的空的wxPython程序 24 1.4 创建最终的hello.py程序 26 2、给你的wxPython程序一个稳固的基础 28 2.1 关于所要求的对象我们需要知道些什么? 28 2.2 如何创建和使用一个应用程序对象? 29 2.2.1 创建一个wx.App的子类 29 何时省略wx.App的子类 30 2.2.2 理解应用程序对象的生命周期 31 2.3 如何定向wxPython程序的输出?
3、 31 2.3.1 重定向输出 32 2.3.2 修改默认的重定向行为 34 2.4 如何关闭wxPython应用程序? 34 2.4.1 管理正常的关闭 35 2.4.2 管理紧急关闭 35 2.5 如何创建和使用顶级窗口对象? 36 2.5.1 使用wx.Frame 36 2 / 565 2.5.2 使用wxPython的ID 37 明确地选择ID号 38 使用全局性的NewID()函数 38 2.5.3 使用wx.Size和wx.Point 38 2.5.4 使用wx.Frame的样式 39 2.6 如何为一个框架增加对象和子窗口? 41 2.6.1 给框架增加窗口部件 42 2.6.2
4、 给框架增加菜单栏、工具栏和状态栏。 44 2.7 如何使用一般的对话框? 45 消息对话框 46 文本输入对话框 47 从一个列表中选择 47 2.8 一些最常见的错误现象及解决方法? 48 2.9 总结 49 3、在事件驱动环境中工作 51 3.1 要理解事件,我们需要知道哪些术语? 51 3.2 什么是事件驱动编程? 52 3.2.1 编写事件处理器 54 3.2.2 设计事件驱动程序 55 3.2.3 事件触发 55 3.3 如何将事件绑定到处理器? 56 3.3.1 使用wx.EvtHandler的方法工作 57 3.4 wxPython是如何处理事件的? 61 3.4.1 理解事件
5、处理过程 62 第一步,创建事件 64 第二步,确定事件对象是否被允许处理事件。 64 第三步 定位绑定器对象 65 3 / 565 第四步 决定是否继续处理 66 第五步 决定是否展开 67 3.4.2 使用Skip()方法 68 3.5 在应用程序对象中还包含哪些其它的属性? 70 3.6 如何创建自己的事件? 71 3.6.1 为一个定制的窗口部件定义一个定制的事件。 71 创建自定义事件的步骤: 71 3.7 总结 75 4、用PyCrust使得wxPython更易处理 76 4.1 如何与wxPython程序交互? 76 PyCrust配置了标准的Python shell 77 4.
6、2 PyCrust的有用特性是什么? 79 4.2.1 自动完成 80 4.2.2 调用提示和参数默认 80 4.2.3 语法高亮 81 4.2.4 Python 帮助 81 4.2.5 命令重调用 82 4.2.6 剪切和粘贴 83 4.2.7 标准shell环境 84 4.2.8 动态更新 85 4.3 PyCrust notebook的标签是干什么的? 87 4.3.1 Namespace标签 87 4.3.2 Display标签 89 4.3.3 Calltip(调用提示)标签 89 4.3.4 Session标签 90 4.3.5 Dispatcher 标签 90 4.4 如何将Py
7、Crust应用于wxPython应用程序。 92 4 / 565 4.5 在Py包中还有其它什么? 96 4.5.1 使用GUI程序工作 97 4.5.2 使用支持模块工作 97 buffer模块 98 crust 模块 100 dispatcher模块 100 editor模块 102 fi lling模块 102 interpreter模块 103 introspect模块 103 shell模块 103 4.6 如何在wxPython中使用Py包中的模块? 104 4.7 本章小结 108 5、创建你的蓝图 109 5.1 重构如何帮我改进我的代码? 109 5.1.1 一个重构的例子
8、110 5.1.2 开始重构 113 5.1.3 进一步重构 114 5.2 如何保持模型(Model)与视图(View)分离? 118 5.2.1 MVC(Model-View-Controller)系统是什么? 118 5.2.2 一个wxPython模型:PyGridTableBase 120 PyGridTableBase的方法 122 使用PyGridTableBase 123 使用PyGridTableBase:特定于应用程序(不通用)的子类 123 使用PyGridTableBase:一个通用的例子 125 使用PyGridTableBase:一个独立的模型类 127 5.2.3
9、 自定义模型 129 5 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! 5.3 如何对一个GUI程序进行单元测试? 133 5.3.1 unittest模块 134 5.3.2 一个unittest范例 135 5.3.3 测试用户事件 137 5.4 本章小结 138 6、使用基本的建造部件 140 6.1 在屏幕上绘画 141 6.1.1 如何在屏幕上绘画 141 使用设备上下文 141 设备上下文的函数 147 6.2 添加窗口装饰 149 6.2.1 如何添加和更新一个状态栏 149 6.2.2
10、 如何添加菜单? 152 6.3 得到标准信息 156 6.3.1 如何使用标准文件对话框? 156 6.3.2 如何使用标准的颜色选择器? 160 6.4 给应用程序一个好看的外观 161 6.4.1 如何布局窗口部件? 161 创建一个sizer 161 使用sizer 162 6.4.2 如何建造一个关于(about)框? 168 6.4.3 如何建造一个启动画面? 170 6.5 本章小结 172 Part 2 基本的wxPython 174 7、使用基本的控件工作 175 7.1 显示文本 175 6 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群78346234
11、7,群里免费提供500+本Py t h o n 书籍! 7.1.1 如何显示静态文本? 175 如何显示静态文本 176 使用样式工作 178 其它显示文本的技术 178 7.1.2 如何让用户输入文本? 179 如何创建文本输入控件 179 使用单行文本控件样式 180 7.1.3 不输入的情况下如何改变文本? 181 7.1.4 如何创建一个多行或样式文本控件? 182 使用多行或丰富文本样式 184 7.1.5 如何创建一个字体? 186 7.1.6 如果我们系统不支持丰富文本,那么我还能使用样式文本吗? 187 7.1.7 如果我的文本控件不匹配我的字符串该怎么办? 187 7.1.8
12、 如何响应文本事件? 188 7.2 使用按钮工作 189 7.2.1 如何生成一个按钮? 189 7.2.2 如何生成一个位图按钮? 191 7.2.3 如何创建开关按钮(toggle button)? 192 7.2.4 什么是通用按钮,我为什么要使用它? 193 7.3 输入并显示数字 196 7.3.1 如何生成一个滑块? 196 如何使用滑块 197 使用滑块样式工作 198 7.3.2 如何得到那些灵巧的上下箭头按钮? 199 如何创建一个微调控制器 199 7.3.3 如何生成一个进度条? 201 7.4 给用户以选择 202 7.4.1 如何创建一个复选框? 202 7 / 5
13、65 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! 7.4.2 如何创建一组单选按钮(radio button)? 204 如何创建单选按钮 205 使用单选框 206 7.4.3 如何创建一个列表框? 209 如何创建一个列表框 209 7.4.4 如何合并复选框和列表框? 212 7.4.5 如果我想要下拉形式的选择该怎么做? 213 7.4.6 我能够将文本域与列表合并在一起吗? 214 7.5 本章小结 216 8、把窗口部件放入框架中 218 8.1 框架的寿命 218 8.1.1 如何创建一个框架? 2
14、18 创建一个简单的框架 218 创建框架的子类 219 8.1.2 有些什么不同的框架样式? 221 8.1.3 如何创建一个有额外样式信息的框架? 223 添加额外样式信息 223 添加额外样式信息的通用方法 224 8.1.4 当关闭一个框架时都发生了什么? 225 何时用户触发关闭过程 226 什么时候系统触发关闭过程 227 8.2 使用框架 227 8.2.1 wx.Frame有那些方法和属性? 227 8.2.2 如何查找框架的子窗口部件? 230 8.2.3 如何创建一个带有滚动条的框架? 231 如何创建滚动条 232 指定滚动区域的尺寸 233 8 / 565 欢迎加入非盈
15、利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! 滚动条事件 234 8.3 可选的框架类型 235 8.3.1 如何创建一个MDI框架? 235 图8.7 236 8.3.2 什么是小型框架,我们为何要用它? 238 8.3.3 如何创建一个非矩形的框架? 239 8.3.4 如何拖动一个没有标题栏的框架? 242 8.4 使用分割窗 244 8.4.1 创建一个分割窗 245 8.4.2 一个分割窗的例子 246 8.4.3 改变分割的外观 249 8.4.4 以程序的方式处理分割 250 8.4.5 响应分割事件 251 8
16、.5 本章小结 252 9、对话框 253 9.1 使用模式对话框工作 253 9.1.1 如何创建一个模式对话框? 253 9.1.2 如何创建一个警告框? 255 使用wx.MessageDialog类 256 使用wx.MessageBox()函数 257 9.1.3 如何从用户得到短的文本? 258 9.1.4 如何用对话框显示选项列表? 261 9.1.5 如何显示进度条? 262 9.2 使用标准对话框 264 9.2.1 如何使用文件选择对话框? 264 选择一个文件 266 选择一个目录 267 9 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462
17、347,群里免费提供500+本Py t h o n 书籍! 9.2.2 如何使用字体选择对话框? 269 9.2.3 如何使用颜色对话框? 271 9.2.4 如何使用户能够浏览图像? 273 9.3 创建向导 274 9.4 显示启动提示 278 9.5 使用验证器(validator)来管理对话框中的数据 279 9.5.1 如何使用验证器来确保正确的数据? 279 9.5.2 如何使用验证器传递数据? 283 9.5.3 如何在数据被键入时验证数据? 287 9.6 本章小结 290 10、创建和使用wxPython菜单 292 10.1 创建菜单 292 10.1.1 如何创建一个菜单
18、栏并把它附加到一个框架? 293 10.1.2 如何创建一个菜单并把它附加到菜单栏? 293 10.1.3 如何给下拉菜单填加项目? 296 10.1.4 如何响应一个菜单事件? 300 10.2 使用菜单项工作 301 10.2.1 如何在一个菜单中找到一个特定的菜单项? 301 10.2.2 如何使一个菜单项有效或无效? 304 10.2.3 如何将一个菜单项与一个快捷键关联起来? 306 使用助记符快捷方式 308 使用加速器快捷方式 309 10.2.4 如何创建一个复选或单选开关菜单项? 310 10.3 进一步构建菜单 313 10.3.1 如何创建一个子菜单? 313 10.3.
19、2 如何创建弹出式菜单? 315 10.3.3 如何创建自己个性的菜单? 318 10 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! 10.4 菜单设计的适用性准则 320 10.4.1 使菜单有均衡的长度 321 10.4.2 创建合理的项目组 321 菜单的顺序要遵循标准 321 对通常使用的项目提供方便的访问 321 使用有含义的菜单名称 321 使用标准的快捷键 322 反映出开关状态 322 10.5 本章小结 323 11 使用sizer放置窗口部件 325 11.1 sizer是什么? 3
20、25 下面是使用一个sizer的三个基本步骤: 326 11.2 基本的sizer:grid sizer 327 11.2.1 什么是grid sizer? 327 11.2.2 如何对sizer添加或移除孩子? 330 使用Add()方法 330 使用insert()方法 331 使用Prepend()方法 331 11.2.3 sizer是如何管理它的孩子的尺寸和对齐的? 332 11.2.4 能够为sizer或它的孩子指定一个最小的尺寸吗? 335 11.2.5 sizer如何管理每个孩子的边框? 337 11.3 使用其它类型的sizer 339 11.3.1 什么是fl ex gri
21、d sizer? 339 11.3.2 什么是grid bag sizer? 343 在grid bag sizer上使用Add()方法 345 11.3.3 什么是box sizer? 347 11.3.4 什么是static box sizer? 351 11 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! 11.4 一个现实中使用sizer的例子 354 11.5 本章小结 358 12 处理基本的图像 360 12.1 使用图像工作 360 12.1.1 如何载入图像? 361 指定一个图像文件格
22、式 363 创建image(图像)对象 364 创建bitmap(位图)对象 364 12.1.2 我们能够对图像作些什么? 365 设置图像的遮罩以指定一个透明的图像 367 设置alpha值来指定一个透明的图像 367 12.1.3 如何改变光标? 368 创建自定义的光标 370 12.2 处理设备上下文 370 12.2.1 什么是设备上下文,以及如何创建它? 371 基于屏幕的设备上下文 371 非屏幕设备上下文 372 缓冲设备上下文 374 12.2.2 如何绘制到设备上下文? 374 12.2.3 如何绘制图像到设备上下文? 381 拷贝部分图像 382 绘制一个位图 382
23、12.2.4 如何绘制文本到设备上下文? 385 12.3 图形处理 386 12.3.1 如何使用画笔处理前景色? 386 12.3.2 如何管理背景画刷? 389 自定义样式 390 12 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! 12.3.3 如何管理逻辑和物理设备坐标? 390 12.3.4 预定义的颜色名有哪些? 392 12.4 本章小结 392 第三部分 高级wxPython 394 13 建造列表控件并管理项目 395 13.1 建造一个列表控件 395 13.1.1 什么是图标模式
24、? 396 13.1.2 什么是小图标模式? 397 13.1.3 什么是列表模式? 399 13.1.4什么是报告模式 401 13.1.5 如何创建一个列表控件? 403 13.2 处理列表中的项目 404 13.2.1 什么是一个图像列表以及如何将图像添加给它? 404 创建一个图像列表 404 添加及移去图像 405 使用图像列表 406 13.2.2 如何对一个列表添加或删除项目? 407 增加一个新行 407 增加列 407 设置多列列表中的值 408 项目属性 408 13.3 响应用户 410 13.3.1 如何响应用户在列表中的选择? 410 13.3.2 如何响应用户在一个
25、列的首部中的选择? 411 13.4 编辑并排序列表控件 417 13.4.1 如何编辑标签? 417 13.4.2 如何对列表排序? 418 13 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! 在创建的时候告诉列表去排序 419 基于数据而非所显示的文本来排序 419 使用mixin类进行列排序 419 13.4.3 进一步了解列表控件 423 13.5 创建一个虚列表控件 426 13.6 本章小结 430 14 网格(grid)控件 432 14.1 创建你的网格 432 14.1.1 如何创建一
26、个简单的网格? 433 14.1.2 如何使用网格表来创建一个网格? 435 14.2 使用网格工作 439 14.2.1 如何添加、删除行,列和单元格? 439 14.2.2 如何处理一个网格的行和列的首部? 440 14.2.3 如何管理网格元素的尺寸? 443 改变单元格的尺寸 445 设置默认尺寸 445 设置标签的尺寸 446 14.2.4 如何管理哪些单元格处于选择或可见状态? 447 14.2.5 如何改变一个网格的单元格的颜色和字体? 449 14.3 自定义描绘器和编辑器 452 14.3.1 如何使用一个自定义的单元格描绘器? 452 预定义的描绘器(renderer) 4
27、53 创建一个自定义的描绘器 454 14.3.2 如何编辑一个单元格? 456 14.3.3 如何使用一个自定义的单元格编辑器? 457 预定义的编辑器 457 创建自定义的编辑器 458 14 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! 14.4 捕获用户事件 462 14.4.1 如何捕获用户的鼠标动作? 462 14.4.2 如何捕获用户的键盘动作? 465 14.5 本章小结 466 15 树形控件(tree control) 468 15.1 创建树形控件并添加项目 468 15.1.1
28、如何添加一个root(根)元素? 481 15.1.2 如何将更多的项目添加到树中? 482 15.1.3 如何管理项目? 482 15.2 树控件的显示样式 483 15.3 对树形控件的元素排序 485 15.4 控制与每项相关的图像 486 15.5 使用编程的方式访问树。 488 15.6 管理树中的选择 490 15.7 控制项目的可见性 490 虚树 491 控制可见性 494 15.8 使树控件可编辑 495 15.9 响应树控件的其它的用户事件 496 15.10 使用树列表控件 497 15.11 本章小结 501 16 在你的应用程序中加入HTML 503 16.1 显示H
29、TML 503 16.1.1 如何在一个wxPython窗口中显示HTML? 503 16.1.2 如何显示来自一个文件或URL的HTML? 506 16.2 管理HTML窗口 508 15 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! 16.2.1 如何响应用户在一个链接上的敲击? 508 16.2.2 如何使用编程的方式改变一个HTML窗口? 509 16.2.3 如何在窗口的标题栏中显示页面的标题? 510 16.2.4 如何打印一个HTML页面? 512 使用wx.html.HtmlEasyPr
30、inting的实例 512 设置字体 513 输出预览 513 打印 513 16.3 拓展HTML窗口 513 16.3.1 HTML解析器(parser)是如何工作的? 514 16.3.2 如何增加对新标记的支持? 515 16.3.3 如何支持其他的文件格式? 519 16.3.4 如何得到一个性能更加完整的HTML控件? 520 16.4 本章小结 521 第17章 wxPython的打印构架 522 17.1 如何用wxPython打印? 522 17.1.1 理解打印输出的生命周期 523 17.1.2 实战打印构架 524 17.1.3 使用wx.Printout的方法工作 5
31、31 17.2 如何显示打印对话框? 532 17.2.1 创建一个打印对话框 532 使用方法 533 使用属性 533 17.3 如何显示页面设置对话框? 535 17.3.1 创建页面设置对话框 535 17.3.2 使用页面设置属性工作 536 17.4 如何打印? 538 16 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! 第一步 按顺序得到你的所有数据 538 第二步 创建一个wx.Printer实例 538 第三步 使用wx.Printer的Print ()方法打印 538 17.5 如何
32、实现一个打印预览? 539 第一步 创建预览实例 539 第二步 创建预览框架 539 第三步 初始化框架 540 17.6 本章小结 540 18 使用wxPython的其它功能 541 18.1 放置对象到剪贴板上 541 18.1.1 得到剪贴板中的数据 541 18.1.2 处理剪贴板中的数据 542 18.1.3 获得剪贴板中的文本数据 543 18.1.4 实战剪贴板 543 18.1.5 传递其它格式的数据 546 步骤1 创建一个数据对象 547 步骤2 创建释放源实例 547 步骤3 执行拖动 548 步骤4 处理释放 548 18.2.1 实战拖动 548 18.3 拖放到
33、的目标 551 18.3.1 使用你的释放到的目标 551 18.3.2 实战释放 553 18.4 传送自定义对象 555 18.4.1 传送自定义的数据对象 555 18.4.2 得到自定义对象 556 18.4.3 以多种格式传送对象 556 17 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! 18.5 使用wx.Timer来设置定时事件 557 18.5.1 产生EVT_TIMER事件 557 创建定时器 557 绑定定时器 558 启动和停止定时器 558 确定当前定时器的状态 559 18.
34、5.2 学习定时器的其它用法 560 18.6 创建一个多线程的wxPython应用程序 560 18.6.1 使用全局函数wx.CallAfter() 561 18.6.2 使用队列对象管理线程的通信 564 18.6.3 开发你自已的解决方案 564 18.7 本章小结 565 18 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! Part1 wxPython入门 1. 欢迎来到wxPython 下面是一个例子,它创建了一个有一个文本框的窗口用来显示鼠标的位 置。 #!/bin/env python
35、import wx class MyFrame(wx.Frame): def _init_(self): wx.Frame._init_(self, None, -1, ”My Frame”, size=(300, 300) panel = wx.Panel(self, -1) panel.Bind(wx.EVT_MOTION, self.OnMove) wx.StaticText(panel, -1, ”Pos:”, pos=(10, 12) self.posCtrl = wx.TextCtrl(panel, -1, ”, pos=(40, 10) def OnMove(self, even
36、t): pos = event.GetPosition() self.posCtrl.SetValue(“%s, %s” % (pos.x, pos.y) if _name_ = _main_: app = wx.PySimpleApp() frame = MyFrame() frame.Show(True) app.MainLoop() 图示如下: 漂亮的界面是一个GUI程序必不可少的一部分,wxPython可以做到这一 点,加之Python强大的功能和简洁的语法,使用得它在Python的gui中成为一种 主流。 19 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783
37、462347,群里免费提供500+本Py t h o n 书籍! 1.1 开始wxPython 首先我们创建一个显示一个图像的文件。这将分三步: 1、首先创建一个空的最小的可以工作的wxPthon程序 2、组织和细化 3、显示wxPython的logo 图示如下: 1.2 创建最小的空的wxPython程序 我们创建一个名为bare.py的程序并键入以下代码: import wx #1 class App(wx.App): #2 def OnInit(self): #3 frame = wx.Frame(parent=None, title=Bare) frame.Show() return
38、True app = App() #4 app.MainLoop() #5 20 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! 上面的代码运行的结果如下: 上面的代码的任何一行都不能少,否则将不能工作。这个基本的wxPython 程序说明了开发任一wxPython程序所必须的五个基本步骤: 1、导入必须的wxPython包 2、子类化wxPython应用程序类 3、定义一个应用程序的初始化方法 4、创建一个应用程序类的实例 5、进入这个应用程序的主事件循环 下面让我们看看这个最小的空的程序是如何一步一步
39、实现的。 1.2.1 导入wxPython 你需要做的第一件事就是导入这个主要的wxPython包,这个包名为wx: import wx 一旦这个包被导入,你就可以引用wxPython的类、函数和常量(它们以wx 为前缀),如下所示: class App(wx.App): 注意:老的引入方式仍然被支持,你可能会遇到用这种老的引入方式的代码。因此我 们将会简短地说明这种老的方式及为什么要改变它。老的包的名字是wxPython,它 包含了一个内在的名为wx模块。那时,通常有两种导入必要的代码的方法,一种就 是从wxPython包中导入wx模块:from wxPython import wx;另一种
40、就是直接从wx模 块中导入所有的东西:from wxPython.wx import *。这两种方法都有严重的缺点。这 第二种方法Python中是不建议使用的,这因为可能导致名字空间冲突,而老的wx模 块通过在其属性前加一个wx前缀避免了这个问题。尽管使用这个安全防范,但是 21 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! import*仍然有可能导致问题,但是许多wxPython程序员喜欢这种类型,并且你将在 老的代码中经常看到这种用法。这种风格的坏处是类名以小写字母开头,而大多数 wxPython
41、方法以大写字母开头,这和通常的Python编写程序的习惯相反。 然而如果你试图避免由于使用import*导致的名字空间膨胀,而使用 from wxPython import wx。那么你就不得不为每个类、函数、常数名键入两次 wx,一次是作为包的前缀,另一次是作为通常的前缀,例如wx.wxWindow。 对于导入顺序需要注意的是:你从wxPython导入其它东西之前必须先导入 wx。通常情况下,Python中的模块导入顺序无关。但是wxPython中的不同,它 是一个复杂的模块。当你第一次导入wx模块时,wxPython要对别的wxPython模 块执行一些初始化工作。例如wxPython中的
42、一些子包,如xrc模块,它在wx模 块导入之前不能够正确的工作,我们必须按下面顺序导入: import wx from wx import xrc 以上的导入顺序只针对wxPython的模块,Python的模块导入顺序没关系。 例如: import sys import wx import os from wx import xrc import urllib 1.2.2 使用应用程序和框架工作 一旦你导入了wx模块,你就能够创建你的应用程序(application)对象和 框架(frame)对象。每个wxPython程序必须有一个application对象和至少一个 frame对象。appl
43、ication对象必须是wx.App的一个实例或你在OnInit()方法中定义 的一个子类的一个实例。当你的应用程序启动的时候,OnInit()方法将被 wx.App父类调用。 22 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! 子类化wxPython application类 下面的代码演示了如何定义我们的wx.App的子类: class MyApp(wx.App): def OnInit(self): frame = wx.Frame(parent=None, id=-1, title=”Bare”
44、) frame.Show() return True 上面我们定义了一个名为MyApp的子类。我们通常在OnInit()方法中创建 frame对象。上面的wx.Frame接受三个参数,仅第一个是必须的,其余的都有默 认值。 调用Show()方法使frame可见,否则不可见。我们可以通过给Show()一个布 尔值参数来设定frame的可见性: frame.Show(False) # 使框架不可见. frame.Show(True) # True是默认值,使框架可见. frame.Hide() # 等同于frame.Show(False) 定义一个应用程序的初始化方法 注意:我们没有为我们的应用程
45、序类定义一个_init_()方法。在Python中,这就意 味着父方法wx.App._init()_将在对象创建时被自动调用。这是一个好的事情。如果 你定义你自己的_init_()方法,不要忘了调用其基类的_init()_方法,示例如下: class App(wx.App): def _init_(self): wx.App._init_(self) 如果你忘了这样做,wxPython不将被初始化并且你的OnInit()方法也不将得到调用。 创建一个应用程序实例并进入它的主事件循环 这步是创建wx.App子类的实例,并调用它的MainLoop()方法: app = App() app.Main
46、Loop() 23 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! 一旦进入主事件循环,控制权将转交给wxPython。wxPython GUI程序主要 响应用户的鼠标和键盘事件。当一个应用程序的所有框架被关闭后,这个 app.MainLoop()方法将返回且程序退出。 1.3 扩展这个最小的空的wxPython程序 现在我们将给空的最小程序增加适当数量的功能,它包含了通常Python编 程的标准并能够作为你自己的程 序的一个基准。下面我们创建一个名为spare.py程序: #!/usr/bin/env
47、python #1 “”Spare.py is a starting point for a wxPython program.” #2 import wx class Frame(wx.Frame): #3 pass class App(wx.App): def OnInit(self): self.frame = Frame(parent=None, title=Spare) #4 self.frame.Show() self.SetTopWindow(self.frame) #5 return True if _name_ = _main_: #6 app = App() app.Mai
48、nLoop() 这个程序仍然很小,只有14行代码,但是它增加了几个重要的项目让我们 考虑到什么样的代码是好的,完整的。 #1 这行看似注释,但是在如linux和unix等操作系统上,它告诉操作系统如 何找到执行程序的解释器。如果这个程序被给予的可执行权限(例如使用 chmod命令),我们可以在命令行下仅仅键入该程序的名字来运行这个程序: 24 / 565 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! % spare.py 这行在其它的操作系统上将被忽略。但是包含它可以实现代码的跨平台。 #2 这是文档字符串,当模块
49、中的第一句是字符串的时候,这个字符串就成 了该模块的文档字符串并存储在该模块的_doc_属性中。你能够在你的代码 中、某些开发平台、甚至交互模式下运行的Python解释器中访问文档字符串: import spare print spare._doc_ Spare.py is a starting point for simple wxPython programs. #3 我们改变了你们创建frame对象的方法。bare版的程序简单地创建了一个 wx.Frame类的实例。在spare版中,我们定义了我们自己的Frame类作为 wx.Frame的子类。此时,最终的结果没有什么不同,但是如果你想在你的框架 中显示诸如文本、按钮、菜单的话,你可能就想要你自己的Frame类了。 #4 我们将对frame实例的引用作为应用程序实例的一个属性 #5 在OnInit()方法中,我们调用了这个App类自己的SetTopWindow()方法, 并传递给它我们新创建的frame实例。我们不必定义SetTopWindow()方法,因为 它继承自wx.App父类。SetTopWindow()方法是一个可选的方法,它让wxPython 方法知道哪个框
链接地址:https://www.31doc.com/p-5530004.html