Как я когерентно организую модули для настольного приложения PyGTK?

Вам нужно mod zzz; только один раз в main.rs.

В aaa.rs и bbb.rs вам нужен use crate::zzz;, а не mod zzz;.

Пример:

Файл src/aaa.rs:

use crate::zzz; // `crate::` is required since 2018 edition

pub fn do_something() {
    zzz::do_stuff();
}

Файл src/bbb.rs:

use crate::zzz;

pub fn do_something_else() {
    zzz::do_stuff();
}

Файл src/main.rs: [1127 ]

// src/main.rs
mod aaa;
mod bbb;
mod zzz;

fn main() {
    aaa::do_something();
    bbb::do_something_else();
}

Файл src/zzz.rs:

pub fn do_stuff() {
    println!("does stuff zzz");
}

Вам понадобится mod zzz; внутри модуля aaa, только если у вас есть каталог с именем aaa и внутри это файлы mod.rs и zzz.rs. Затем вам нужно будет поместить mod zzz; в mod.rs, чтобы сделать подмодуль aaa::zzz видимым для остальной части вашей программы.

7
задан bouvard 19 October 2008 в 15:05
поделиться

6 ответов

У Болотной птицы проекта мы используем Python gtkmvc, который делает намного легче применить шаблоны MVC при использовании pygtk и поляну, Вы видите структуру файлов нашего проекта в репозитории SVN:

wader/
  cli/
  common/
  contrib/
  gtk/
    controllers/
    models/
    views/
  test/
  utils/
7
ответ дан 6 December 2019 в 19:44
поделиться

Это, вероятно, не имеет никакого отношения к PyGTK, а скорее общей организационной проблеме кода. Вы, вероятно, извлекли бы выгоду из применения некоторого MVC (Образцовый Контроллер Представления) шаблоны разработки. См. Шаблоны разработки, например.

2
ответ дан 6 December 2019 в 19:44
поделиться

"содержит класс первичного приложения (большинство функциональных стандартных программ)"

Как в исключительном - один класс?

Я не удивлен, что Один Класс Делает Все разрабатывает, не работает. Это не могло бы быть тем, что я назову объектно-ориентированным. Это не кажется, что следует типичному шаблону разработки MVC, если Ваша функциональность накапливается в едином классе.

Что находится в этом крупном классе? Я предполагаю, что можно, вероятно, осуществить рефакторинг это в части. У Вас есть два размера кандидата для рефакторинга Вашего класса приложений - если, действительно, я угадал, что Вы поместили все в единый класс.

  1. Прежде, чем сделать что-либо еще, осуществите рефакторинг в компоненты, которые параллельны Объектам Реального мира. Не ясно, что находится в Вашем "state.py" - является ли это надлежащей моделью реальных объектов или просто отображениями между персистентным устройством хранения данных и некоторой темной структурой данных в приложении. Скорее всего, Вы переместили бы обработку из своего приложения и в Вашу модель (возможно state.py, возможно новый модуль, который является надлежащей моделью.)

    Разломайте свою модель на кусочки. Это поможет организовать управление и просмотреть элементы. Наиболее распространенная ошибка MVC состоит в том, чтобы поместить слишком много в управление и ничто в модели.

  2. Позже, после того как Ваша модель делает большую часть работы, можно посмотреть на, осуществляют рефакторинг в компоненты, которые параллельны презентации GUI. Различные кадры верхнего уровня, например, должны, вероятно, иметь отдельные объекты cotrol. Не ясно, что находится в "GUI.py" - это могло бы быть надлежащим представлением. То, что, кажется, отсутствует, является Компонентом элемента управления.

2
ответ дан 6 December 2019 в 19:44
поделиться

Извините, что ответил настолько поздно. Новозеландец кажется мне намного лучшим решением, чем gtkmvc. Это - моя первая зависимость для любого pygtk проекта.

2
ответ дан 6 December 2019 в 19:44
поделиться

Python 2.6 поддерживает явный относительный импорт, который делает пакеты использования еще легче, чем предыдущие версии. Я предлагаю, чтобы Вы изучили повреждение Вашего приложения в меньшие модули в пакете. Можно организовать приложение как это:

myapp/
  application/
  gui/
  command/
  state/

Где каждый каталог имеет свое собственное __init__.py. Можно взглянуть на любое приложение Python или даже стандартные модули библиотеки для примеров.

0
ответ дан 6 December 2019 в 19:44
поделиться

Так не получавший ответ относительно моего редактирования к исходному вопросу, я провел еще некоторое исследование и заключение, в которое я, кажется, приезжаю, то, что да, я должен выломать интерфейс в несколько представлений, каждого с его собственным контроллером. Python-gtkmvc обеспечивает способность к этому путем обеспечения a glade_top_widget_name параметр конструктору Представления. Это все, кажется, имеет большой смысл, хотя он собирается потребовать большого рефакторинга моей существующей кодовой базы, которую я могу или не могу быть готов предпринять в краткосрочном (я знаю, я знаю, я должен.), Кроме того, меня оставляют задаться вопросом, должен ли просто иметь единственный Объект модели (мое приложение довольно просто - не больше, чем двадцать пять Вара состояния), или если я должен выломать его в многоуровневые модели и иметь для контакта с контроллерами, наблюдая многоуровневые модели и объединяя уведомления в цепочку через них. (Снова, я знаю, что действительно должен сделать последнего.), Если у кого-либо есть дальнейшее понимание, я все еще действительно не чувствую, что получил ответ на исходный вопрос, хотя у меня есть направление для заголовка в теперь.

(Кроме того, это походит на их, должны быть другие варианты архитектуры под рукой, учитывая, что вплоть до сих пор я не видел единственное приложение Python, кодированное в стиле MVC, но с другой стороны много приложений Python имеют тенденцию иметь точную проблему, которую я описал выше.)

0
ответ дан 6 December 2019 в 19:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: