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

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

Note

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

FrameWork的工作已经停止了,现在PyObjC可用于从 Python 进行完整的 Cocoa 访问,并且文档仅描述了最重要的Function,而没有以最合乎逻辑的方式描述。检查源或示例以获取更多详细信息。以下是在 MacPython 新闻组上发布的有关FrameWork的优点和局限性的一些 Comment:

Note

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

FrameWork模块定义以下Function:

  • FrameWork. Application ( )

    • 代表完整应用程序的对象。请参阅下面的方法说明。默认的init()例程创建一个空的窗口字典和一个带有 Apple 菜单的菜单栏。
  • FrameWork. MenuBar ( )

    • 代表菜单栏的对象。该对象通常不是用户创建的。
  • FrameWork. Menu(* bar title * [,* after *])

    • 代表菜单的对象。创建后,您传递MenuBar菜单出现在菜单中,* title 字符串和菜单应出现的位置(从 1 开始)在 after *之后(默认值:末尾)。
  • FrameWork. MenuItem(菜单标题 [,快捷方式回叫])

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

除了可调用对象之外,回调还可以是字符串。在这种情况下,菜单选择会导致在最上方的窗口和应用程序中查找方法。方法名称是带有'domenu_'的回调字符串。

调用MenuBar fixmenudimstate()方法可基于当前的前窗口为所有菜单项设置正确的调光。

  • FrameWork. Separator(菜单)

    • 在菜单末尾添加分隔符。
  • FrameWork. SubMenu(菜单标签)

    • 在菜单* menu 下创建一个名为 label *的子菜单。返回菜单对象。
  • FrameWork. Window(* parent *)

    • 创建一个(无模式)窗口。 * Parent *是窗口所属的应用程序对象。该窗口直到稍后才显示。
  • FrameWork. DialogWindow(* parent *)

    • 创建一个无模式的对话框窗口。
  • FrameWork. windowbounds(宽度高度)

    • 返回一个适合创建给定宽度和高度的窗口的(left, top, right, bottom)Tuples。该窗口将相对于以前的窗口错开,并try将整个窗口保持在屏幕上。但是,窗口将始终是给定的确切大小,因此部件可能不在屏幕上。
  • FrameWork. setwatchcursor ( )

    • 将鼠标光标设置在手表上。
  • FrameWork. setarrowcursor ( )

    • 将鼠标光标设置为箭头。

37.6.1. 应用对象

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

  • Application. makeusermenus ( )

    • 如果需要在应用程序中使用菜单,请重写此方法。将菜单追加到属性menubar
  • Application. getabouttext ( )

    • 重写此方法可返回描述您的应用程序的文本字符串。或者,重写do_about()方法以获得更详细的“关于”消息。
  • Application. mainloop([掩码 [,await]])

    • 该例程是主事件循环,调用它可以设置应用程序滚动。 * Mask 是要处理的事件的掩码, wait 是要留给其他并发应用程序的滴答数(默认为 0,这可能不是一个好主意)。虽然仍然支持 self *退出主循环,但不建议这样做:而是调用self._quit()

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

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

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

返回旧的开/关值。

  • Application. _quit ( )

    • 在下一个方便的 Moment 终止正在运行的mainloop()通话。
  • Application. do_char(* c event *)

    • 用户键入字符* c 。该事件的完整详细信息可以在 event *结构中找到。也可以在Window对象中提供此方法,如果窗口位于最前面,该对象将覆盖应用程序范围的处理程序。
  • Application. do_dialogevent(* event *)

    • 在事件循环的早期调用,以处理无模式对话框事件。默认方法只是将事件调度到相关对话框(而不是pass所涉及的DialogWindow对象)。如果需要特殊处理对话框事件(键盘快捷键等),则覆盖。
  • Application. idle(* event *)

    • 没有可用事件时,由主事件循环调用。传递了空事件(因此您可以查看鼠标的位置,等等)。

37.6.2. 窗口对象

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

  • Window. open ( )

    • 重写此方法可打开一个窗口。将 Mac OS 的 window-id 存储在self.wid中,并调用do_postopen()方法向父应用程序注册该窗口。
  • Window. close ( )

    • 重写此方法可对窗口关闭进行任何特殊处理。调用do_postclose()方法来清除父状态。
  • Window. do_postresize(宽度高度,* 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 对象还具有以下方法:

  • ControlsWindow. do_controlhit(窗口控制,* pcode *,事件)
    • 控件* control 的部分 pcode *被用户点击。跟踪等已经得到了解决。

37.6.4. ScrolledWindow 对象

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

  • ScrolledWindow. scrollbars([* wantx * [,* wanty *]])

    • 创建(或销毁)水平和垂直滚动条。参数指定您想要的参数(默认值:全部)。滚动条始终具有最小0和最大32767
  • ScrolledWindow. getscrollbarvalues ( )

    • 您必须提供此方法。它应该返回一个 Tuples(x, y),以给出滚动条的当前位置(在032767之间)。您可以返回None来表示整个文档在该方向上都可见。
  • ScrolledWindow. updatescrollbars ( )

  • ScrolledWindow. scrollbar_callback(* which what value *)

    • 由您提供,并在用户交互后调用。 哪个将是'x''y'什么将是'-''--''set''++''+'。对于'set',* value *将包含新的滚动条位置。
  • ScrolledWindow. scalebarvalues(* absmin absmax curmin curmax *)

    • 辅助方法,可帮助您计算要从getscrollbarvalues()返回的值。您传递文档的最小值和最大值以及最上面(最左边)和最下面(最右边)的可见值,它返回正确的数字或None
  • ScrolledWindow. do_activate(* onoff event *)

    • 当窗口成为最前面时,照顾滚动条的变暗/突出显示。如果覆盖此方法,请在方法末尾调用此方法。
  • ScrolledWindow. do_postresize(宽度高度窗口)

    • 将滚动条移动到正确的位置。如果您覆盖它,请首先调用此方法。
  • ScrolledWindow. do_controlhit(窗口控制,* pcode *,事件)

    • 处理滚动条交互。如果覆盖它,则首先调用此方法,返回值非零,表示该命中在滚动条中并且已经处理。

37.6.5. DialogWindow 对象

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

  • DialogWindow. open(* resid *)

    • 从 ID 为* resid *的 DLOG 资源创建对话框窗口。对话框对象存储在self.wid中。
  • DialogWindow. do_itemhit(* item event *)

    • 项目编号* item *被点击。您负责重新绘制切换按钮等。