37.6. FrameWork — 交互式应用程序框架 — Python 文档
37.6. 框架 — 交互式应用框架
FrameWork 模块包含共同为交互式 Macintosh 应用程序提供框架的类。 程序员通过创建覆盖基类的各种方法的子类来构建应用程序,从而实现所需的功能。 覆盖功能通常可以在各种不同的级别上完成,即 要以非标准方式处理单个对话窗口中的点击,无需覆盖完整的事件处理。
笔记
此模块已在 Python 3.x 中删除。
FrameWork 上的工作几乎停止了,现在 PyObjC
可用于从 Python 完全 Cocoa 访问,并且文档仅描述了最重要的功能,而不是最合乎逻辑的方式那。 检查源或示例以获取更多详细信息。 以下是发布在 MacPython 新闻组上的关于 FrameWork 的优势和局限性的一些评论:
FrameWork 模块定义了以下函数:
- FrameWork.Application()
- 代表完整应用程序的对象。 有关方法的说明,请参见下文。 默认的
__init__()
例程创建一个空的窗口字典和一个带有苹果菜单的菜单栏。
- FrameWork.MenuBar()
- 表示菜单栏的对象。 这个对象通常不是由用户创建的。
- FrameWork.Menu(bar, title[, after])
- 表示菜单的对象。 创建后,您传递菜单出现的
MenuBar
、title 字符串和菜单应出现的位置(基于 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)
,给出滚动条的当前位置(在0
和32767
之间)。 您可以返回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)
- 物品编号 物品 被击中。 您负责重绘切换按钮等。