framework.md
1> **Источник:** https://python-all.ru/2.7/library/framework.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 37.6. [`FrameWork`](https://python-all.ru/2.7/library/framework.html#module-FrameWork) – Интерактивный каркас приложений89Модуль [`FrameWork`](https://python-all.ru/2.7/library/framework.html#module-FrameWork) содержит классы, которые вместе образуют каркас для создания интерактивных приложений Macintosh. Программист строит приложение, создавая подклассы и переопределяя различные методы базовых классов, реализуя таким образом нужную функциональность. Переопределение функциональности часто можно выполнять на разных уровнях: например, чтобы обрабатывать щелчки в отдельном диалоговом окне нестандартным способом, не нужно переопределять всю обработку событий.1011> **Примечание**12>13> Этот модуль был удалён в Python 3.x.1415Работа над [`FrameWork`](https://python-all.ru/2.7/library/framework.html#module-FrameWork) практически прекращена, теперь, когда `PyObjC` доступен для полного доступа к Cocoa из Python, а документация описывает только самую важную функциональность, и притом не самым логичным образом. Для получения более подробной информации изучите исходный код или примеры. Ниже приведены некоторые комментарии, опубликованные в новостной группе MacPython, о сильных и слабых сторонах [`FrameWork`](https://python-all.ru/2.7/library/framework.html#module-FrameWork):1617> Сильная сторона [`FrameWork`](https://python-all.ru/2.7/library/framework.html#module-FrameWork) в том, что он позволяет вмешиваться в поток управления во многих точках. [`W`](https://python-all.ru/2.7/library/undoc.html#module-W), например, использует другой способ включения/отключения меню, и это легко встраивается, оставляя остальное нетронутым. Слабые стороны [`FrameWork`](https://python-all.ru/2.7/library/framework.html#module-FrameWork): отсутствие абстрактного интерфейса команд (но это не должно быть сложно исправить), минимальная поддержка диалогов и полное отсутствие поддержки элементов управления и панелей инструментов.1819Модуль [`FrameWork`](https://python-all.ru/2.7/library/framework.html#module-FrameWork) определяет следующие функции:2021#### `FrameWork.Application()`2223Объект, представляющий приложение целиком. Описание методов см. ниже. Стандартная процедура [`__init__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__init__) создает пустой словарь окон и строку меню с меню Apple.2425#### `FrameWork.MenuBar()`2627Объект, представляющий строку меню. Обычно этот объект не создается пользователем.2829#### `FrameWork.Menu(bar, title[, after])`3031Объект, представляющий меню. При создании вы передаете `MenuBar`, в котором будет меню, строку *заголовок* и позицию (начиная с 1) *после*, где должно появиться меню (по умолчанию – в конце).3233#### `FrameWork.MenuItem(menu, title[, shortcut, callback])`3435Создает объект пункта меню. Аргументы: меню, в котором создается пункт, строка заголовка пункта, а также, опционально, сочетание клавиш и функция обратного вызова (колбэк). Колбэк вызывается с аргументами: идентификатор меню, номер пункта внутри меню (начиная с 1), текущее переднее окно и запись события.3637Вместо вызываемого объекта в качестве колбэка можно передать строку. В этом случае при выборе пункта меню выполняется поиск метода в верхнем окне и приложении. Имя метода образуется путем добавления `'domenu_'` к строке колбэка.3839Вызов метода `MenuBar` `fixmenudimstate()` устанавливает правильное отключение для всех пунктов меню в зависимости от текущего переднего окна.4041#### `FrameWork.Separator(menu)`4243Добавляет разделитель в конец меню.4445#### `FrameWork.SubMenu(menu, label)`4647Создает подменю с именем *label* в меню *menu*. Возвращается объект меню.4849#### `FrameWork.Window(parent)`5051Создает (немодальное) окно. *Parent* – это объект приложения, которому принадлежит окно. Окно не отображается до следующего вызова.5253#### `FrameWork.DialogWindow(parent)`5455Создает немодальное диалоговое окно.5657#### `FrameWork.windowbounds(width, height)`5859Возвращает кортеж `(left, top, right, bottom)`, подходящий для создания окна заданной ширины и высоты. Окно будет смещено относительно предыдущих окон, и предпринимается попытка уместить всё окно на экране. Однако окно всегда будет точно заданного размера, поэтому его части могут оказаться за пределами экрана.6061#### `FrameWork.setwatchcursor()`6263Устанавливает курсор мыши в режим песочных часов (watch).6465#### `FrameWork.setarrowcursor()`6667Устанавливает курсор мыши в виде стрелки.6869## 37.6.1. Объекты приложения7071Объекты приложения имеют следующие методы, в числе прочих:7273#### `Application.makeusermenus()`7475Переопределите этот метод, если вашему приложению нужны меню. Добавьте меню в атрибут `menubar`.7677#### `Application.getabouttext()`7879Переопределите этот метод, чтобы вернуть текстовую строку с описанием приложения. В качестве альтернативы можно переопределить метод `do_about()` для более подробных сообщений «О программе».8081#### `Application.mainloop([mask[, wait]])`8283Эта процедура является основным циклом событий; вызовите её, чтобы запустить приложение. *Mask* – это маска событий, которые нужно обрабатывать; *wait* – количество тиков (ticks), которое следует выделить другим параллельным приложениям (по умолчанию 0, что, вероятно, не очень хорошая идея). Хотя вызов *self* для выхода из основного цикла по-прежнему поддерживается, это не рекомендуется: вместо этого вызывайте `self._quit()`.8485Цикл событий разбит на множество небольших частей, каждую из которых можно переопределить. Методы по умолчанию занимаются диспетчеризацией событий окнам и диалогам, обработкой перетаскивания и изменения размеров, событий Apple, событий для окон, не относящихся к FrameWork, и т.д.8687В общем случае все обработчики событий должны возвращать `1`, если событие полностью обработано, и `0` в противном случае (например, потому что переднее окно не было окном FrameWork). Это нужно, чтобы события обновления и подобные могли передаваться другим окнам, например окну консоли Sioux. Вызов `MacOS.HandleEvent()` не разрешен внутри *our\_dispatch* или вызываемых им функций, так как это может привести к бесконечному циклу, если код вызывается через обработчик событий внутреннего цикла Python.8889#### `Application.asyncevents(onoff)`9091Вызовите этот метод с ненулевым параметром, чтобы включить асинхронную обработку событий. Это укажет внутреннему циклу интерпретатора вызывать обработчик событий приложения *async\_dispatch* всякий раз, когда доступны события. Это позволит обновлениям окон FrameWork и пользовательскому интерфейсу оставаться рабочими во время длительных вычислений, но замедлит работу интерпретатора и может привести к неожиданным результатам в нереентерабельном коде (например, в самом FrameWork). По умолчанию *async\_dispatch* немедленно вызывает *our\_dispatch*, но вы можете переопределить это поведение, чтобы обрабатывать асинхронно только определённые события. События, которые вы не обрабатываете, будут переданы Sioux и подобным.9293Возвращается предыдущее значение вкл/выкл.9495#### `Application._quit()`9697Завершить выполняющийся вызов [`mainloop()`](https://python-all.ru/2.7/library/framework.html#FrameWork.Application.mainloop) при ближайшей удобной возможности.9899#### `Application.do_char(c, event)`100101Пользователь ввёл символ *c*. Полные подробности события можно найти в структуре *event*. Этот метод также может быть предоставлен в объекте `Window`, который переопределяет общеприкладной обработчик, если окно является передним.102103#### `Application.do_dialogevent(event)`104105Вызывается в начале цикла событий для обработки событий немодальных диалогов. Метод по умолчанию просто отправляет событие соответствующему диалогу (не через задействованный объект `DialogWindow`). Переопределите, если требуется специальная обработка событий диалога (клавиатурные сокращения и т.д.).106107#### `Application.idle(event)`108109Вызывается главным циклом событий, когда нет доступных событий. Передаётся нулевое событие (так что можно проверить положение мыши и т.д.).110111## 37.6.2. Объекты окна112113Объекты Window имеют следующие методы, среди прочих:114115#### `Window.open()`116117Переопределите этот метод, чтобы открыть окно. Сохраните идентификатор окна Mac OS в `self.wid` и вызовите метод `do_postopen()` для регистрации окна в родительском приложении.118119#### `Window.close()`120121Переопределите этот метод для выполнения специальной обработки при закрытии окна. Вызовите метод `do_postclose()`, чтобы очистить состояние родителя.122123#### `Window.do_postresize(width, height, macoswindowid)`124125Вызывается после изменения размера окна. Переопределите, если требуется сделать больше, чем просто вызов `InvalRect`.126127#### `Window.do_contentclick(local, modifiers, event)`128129Пользователь щёлкнул в области содержимого окна. Аргументы: координаты (относительно окна), модификаторы клавиш и исходное событие.130131#### `Window.do_update(macoswindowid, event)`132133Получено событие обновления окна. Перерисуйте окно.134135#### `Window.do_activate(activate, event)`136137Окно было активировано (`activate == 1`) или деактивировано (`activate == 0`). Обработайте такие вещи, как подсветка фокуса и т.д.138139## 37.6.3. Объект ControlsWindow140141Объекты ControlsWindow имеют следующие методы помимо методов объектов `Window`:142143#### `ControlsWindow.do_controlhit(window, control, pcode, event)`144145Часть *pcode* элемента управления *control* была нажата пользователем. Отслеживание и прочее уже обработано.146147## 37.6.4. Объект ScrolledWindow148149Объекты ScrolledWindow являются объектами ControlsWindow со следующими дополнительными методами:150151#### `ScrolledWindow.scrollbars([wantx[, wanty]])`152153Создайте (или уничтожьте) горизонтальные и вертикальные полосы прокрутки. Аргументы указывают, какие из них нужны (по умолчанию обе). Полосы прокрутки всегда имеют минимум `0` и максимум `32767`.154155#### `ScrolledWindow.getscrollbarvalues()`156157Вы должны предоставить этот метод. Он должен возвращать кортеж `(x, y)`, указывающий текущее положение полос прокрутки (между `0` и `32767`). Вы можете вернуть `None` для любой из них, чтобы указать, что весь документ виден в этом направлении.158159#### `ScrolledWindow.updatescrollbars()`160161Вызовите этот метод, когда документ изменился. Он вызовет [`getscrollbarvalues()`](https://python-all.ru/2.7/library/framework.html#FrameWork.ScrolledWindow.getscrollbarvalues) и обновит полосы прокрутки.162163#### `ScrolledWindow.scrollbar_callback(which, what, value)`164165Предоставляется и вызывается после взаимодействия с пользователем. *which* будет `'x'` или `'y'`, *what* будет `'-'`, `'--'`, `'set'`, `'++'` или `'+'`. Для `'set'`, *value* будет содержать новое положение полосы прокрутки.166167#### `ScrolledWindow.scalebarvalues(absmin, absmax, curmin, curmax)`168169Вспомогательный метод, помогающий вычислить значения для возврата из [`getscrollbarvalues()`](https://python-all.ru/2.7/library/framework.html#FrameWork.ScrolledWindow.getscrollbarvalues). Передаётся минимальное и максимальное значение документа, а также верхнее (левое) и нижнее (правое) видимые значения, и возвращается правильное число или `None`.170171#### `ScrolledWindow.do_activate(onoff, event)`172173Занимается затемнением/подсветкой полос прокрутки, когда окно становится передним. Если этот метод переопределяется, его следует вызывать в конце переопределяющего метода.174175#### `ScrolledWindow.do_postresize(width, height, window)`176177Перемещает полосы прокрутки в правильное положение. Этот метод следует вызывать в начале, если он переопределяется.178179#### `ScrolledWindow.do_controlhit(window, control, pcode, event)`180181Обрабатывает взаимодействие с полосами прокрутки. Если этот метод переопределяется, его следует вызывать первым; ненулевое возвращаемое значение указывает, что попадание пришлось на полосы прокрутки и было обработано.182183## 37.6.5. Объекты DialogWindow184185Объекты DialogWindow имеют следующие методы в дополнение к методам объектов `Window`:186187#### `DialogWindow.open(resid)`188189Создаёт диалоговое окно из ресурса DLOG с идентификатором *resid*. Объект диалога сохраняется в `self.wid`.190191#### `DialogWindow.do_itemhit(item, event)`192193Был активирован элемент номер *item*. Ответственность за перерисовку переключателей и т.п. лежит на вызывающем коде.194