37.6. FrameWork — 交互式应用程序框架 — Python 文档

来自菜鸟教程
Python/docs/2.7/library/framework
跳转至:导航、​搜索

37.6. 框架 — 交互式应用框架

FrameWork 模块包含共同为交互式 Macintosh 应用程序提供框架的类。 程序员通过创建覆盖基类的各种方法的子类来构建应用程序,从而实现所需的功能。 覆盖功能通常可以在各种不同的级别上完成,即 要以非标准方式处理单个对话窗口中的点击,无需覆盖完整的事件处理。

笔记

此模块已在 Python 3.x 中删除。


FrameWork 上的工作几乎停止了,现在 PyObjC 可用于从 Python 完全 Cocoa 访问,并且文档仅描述了最重要的功能,而不是最合乎逻辑的方式那。 检查源或示例以获取更多详细信息。 以下是发布在 MacPython 新闻组上的关于 FrameWork 的优势和局限性的一些评论:

FrameWork 的优点在于它允许您在许多不同的地方进入控制流。 例如,W 使用不同的方式来启用/禁用菜单,并且直接插入,其余部分保持不变。 FrameWork 的弱点是它没有抽象的命令接口(但这应该不难),它的对话框支持很少,并且它的控件/工具栏支持不存在。


FrameWork 模块定义了以下函数:

FrameWork.Application()
代表完整应用程序的对象。 有关方法的说明,请参见下文。 默认的 __init__() 例程创建一个空的窗口字典和一个带有苹果菜单的菜单栏。
FrameWork.MenuBar()
表示菜单栏的对象。 这个对象通常不是由用户创建的。
FrameWork.Menu(bar, title[, after])
表示菜单的对象。 创建后,您传递菜单出现的 MenuBartitle 字符串和菜单应出现的位置(基于 1)after(默认值:在结尾)。
FrameWork.MenuItem(menu, title[, shortcut, callback])

创建一个菜单项对象。 参数是要创建的菜单、项目标题字符串以及可选的键盘快捷键和回调例程。 使用参数 menu-id、菜单中的项目编号(基于 1)、当前前窗口和事件记录调用回调。

回调也可以是字符串,而不是可调用对象。 在这种情况下,菜单选择会导致在最顶部的窗口和应用程序中查找方法。 方法名称是带有 'domenu_' 前缀的回调字符串。

调用 MenuBar fixmenudimstate() 方法根据当前的前窗口为所有菜单项设置正确的变暗。

FrameWork.Separator(menu)
在菜单末尾添加分隔符。
FrameWork.SubMenu(menu, label)
在菜单菜单下创建一个名为标签的子菜单。 返回菜单对象。
FrameWork.Window(parent)
创建一个(无模式)窗口。 Parent是窗口所属的应用对象。 直到稍后才会显示该窗口。
FrameWork.DialogWindow(parent)
创建一个无模式的对话窗口。
FrameWork.windowbounds(width, height)
返回适合创建给定宽度和高度的窗口的 (left, top, right, bottom) 元组。 该窗口将与之前的窗口交错,并尝试将整个窗口保持在屏幕上。 然而,窗口将始终是给定的确切大小,因此部分可能在屏幕外。
FrameWork.setwatchcursor()
将鼠标光标设置为手表。
FrameWork.setarrowcursor()
将鼠标光标设置为箭头。

37.6.1. 应用对象

应用程序对象具有以下方法,其中包括:

Application.makeusermenus()
如果您的应用程序中需要菜单,请覆盖此方法。 将菜单附加到属性 menubar
Application.getabouttext()
覆盖此方法以返回描述您的应用程序的文本字符串。 或者,覆盖 do_about() 方法以获得更详细的“关于”消息。
Application.mainloop([mask[, wait]])

这个例程是主事件循环,调用它来设置你的应用程序滚动。 Mask 是您要处理的事件的掩码,wait 是您要留给其他并发应用程序的滴答数(默认为 0,这可能不是一个好主意)。 虽然仍然支持提升 self 以退出主循环,但不推荐:改为调用 self._quit()

事件循环被分成许多小部分,每个部分都可以被覆盖。 默认方法负责将事件分派到窗口和对话框、处理拖动和调整大小、Apple 事件、非 FrameWork 窗口的事件等。

通常,如果事件被完全处理,所有事件处理程序都应该返回 1,否则返回 0(例如,因为前窗口不是框架窗口)。 这是必需的,以便更新事件等可以传递到其他窗口,如 Sioux 控制台窗口。 在 our_dispatch 或其被调用者中不允许调用 MacOS.HandleEvent(),因为如果通过 Python 内循环事件处理程序调用代码,这可能会导致无限循环。

Application.asyncevents(onoff)

使用非零参数调用此方法以启用异步事件处理。 这将告诉内部解释器循环在事件可用时调用应用程序事件处理程序 async_dispatch。 这将导致 FrameWork 窗口更新和用户界面在长时间计算期间保持工作,但会减慢解释器的速度,并可能在不可重入代码(例如 FrameWork 本身)中导致令人惊讶的结果。 默认情况下 async_dispatch 将立即调用 our_dispatch 但您可以覆盖它以仅异步处理某些事件。 您不处理的事件将传递给 Sioux 等。

返回旧的开/关值。

Application._quit()
在下一个方便的时刻终止正在运行的 mainloop() 调用。
Application.do_char(c, event)
用户键入字符 c。 事件的完整细节可以在 event 结构中找到。 此方法也可以在 Window 对象中提供,如果窗口位于最前面,它会覆盖应用程序范围的处理程序。
Application.do_dialogevent(event)
在事件循环的早期调用以处理无模式对话框事件。 默认方法只是将事件分派到相关对话框(而不是通过所涉及的 DialogWindow 对象)。 如果您需要特殊处理对话框事件(键盘快捷键等),请覆盖。
Application.idle(event)
当没有事件可用时由主事件循环调用。 传递空事件(因此您可以查看鼠标位置等)。


37.6.2. 窗口对象

Window 对象具有以下方法,其中包括:

Window.open()
覆盖此方法以打开一个窗口。 将Mac OS window-id存储在self.wid中,调用do_postopen()方法向父应用注册窗口。
Window.close()
覆盖此方法以在窗口关闭时执行任何特殊处理。 调用 do_postclose() 方法来清理父状态。
Window.do_postresize(width, height, macoswindowid)
在调整窗口大小后调用。 如果需要做的比调用 InvalRect 还多,则覆盖。
Window.do_contentclick(local, modifiers, event)
用户单击了窗口的内容部分。 参数是坐标(相对于窗口)、键修饰符和原始事件。
Window.do_update(macoswindowid, event)
接收到窗口的更新事件。 重新绘制窗口。
Window.do_activate(activate, event)
窗口已激活 (activate == 1) 或停用 (activate == 0)。 处理焦点突出显示等。


37.6.3. 控件窗口对象

ControlsWindow 对象除了 Window 对象还有以下方法:

ControlsWindow.do_controlhit(window, control, pcode, event)
控件 control 的部分 pcode 被用户击中。 跟踪等已经得到处理。


37.6.4. 滚动窗口对象

ScrolledWindow 对象是具有以下额外方法的 ControlsWindow 对象:

ScrolledWindow.scrollbars([wantx[, wanty]])
创建(或销毁)水平和垂直滚动条。 参数指定您想要的(默认值:两者)。 滚动条总是有最小值 0 和最大值 32767
ScrolledWindow.getscrollbarvalues()
您必须提供此方法。 它应该返回一个元组 (x, y),给出滚动条的当前位置(在 032767 之间)。 您可以返回 None 以指示整个文档在该方向可见。
ScrolledWindow.updatescrollbars()
当文档更改时调用此方法。 它将调用 getscrollbarvalues() 并更新滚动条。
ScrolledWindow.scrollbar_callback(which, what, value)
由您提供并在用户交互后调用。 其中将是'x''y'什么将是'-''--'、[ X95X]、'++''+'。 对于 'set'value 将包含新的滚动条位置。
ScrolledWindow.scalebarvalues(absmin, absmax, curmin, curmax)
帮助您计算从 getscrollbarvalues() 返回的值的辅助方法。 您传递文档的最小值和最大值以及最顶部(最左侧)和最底部(最右侧)的可见值,它会返回正确的数字或 None
ScrolledWindow.do_activate(onoff, event)
当窗口变为最前面时,负责调暗/突出显示滚动条。 如果您覆盖此方法,请在您的方法结束时调用此方法。
ScrolledWindow.do_postresize(width, height, window)
将滚动条移动到正确的位置。 如果您覆盖它,最初调用此方法。
ScrolledWindow.do_controlhit(window, control, pcode, event)
处理滚动条交互。 如果您首先覆盖它调用此方法,则非零返回值表示命中位于滚动条中并已被处理。


37.6.5. 对话框窗口对象

DialogWindow 对象除了 Window 对象还有以下方法:

DialogWindow.open(resid)
从 ID 为 resid 的 DLOG 资源创建对话窗口。 对话对象存储在 self.wid 中。
DialogWindow.do_itemhit(item, event)
物品编号 物品 被击中。 您负责重绘切换按钮等。