Методы программирования tkinter и GUI

Надеюсь, это не подпадает под «тему общего обсуждения», так как я хотел бы, чтобы это было скорее решение этих проблем эффективным способом, чем гигантские дебаты о том, какой общий подход к программированию GUI является абсолютным лучшим.

Итак, я начал программирование GUI с tkinter и вкратце, мой код становится довольно уродливым довольно быстро. Я пытаюсь создать редактор карт на основе плитки для видеоигры. Похоже, мои главные проблемы:

невозможность обратных вызовов для возврата значений.невозможность передачи данных между окнами легко.

Я предполагаю, что причина, по которой я вижу это как проблемы, заключается в том, что я использую функции гораздо чаще, чем классы. Например, мое окно «load tileset» обрабатывается полностью функционально: щелчок по опции меню в главном окне вызывает функцию, которая загружает новое окно. Из этого окна я создаю диалог открытия файла при поиске изображения и изменяю холст, отображающий изображение, когда нажимаю клавишу ввода (чтобы он рисовал соответствующую сетку поверх изображения). функция функция функция.

То, что кажется мне действительно плохой практикой, - это включение дополнительных аргументов для компенсации. Например, когда я создаю набор плиток, экземпляр созданного класса TileSet должен быть отправлен обратно в главное окно, где может отображаться соответствующая информация. У меня есть список загруженных наборов плиток в качестве глобальной переменной (еще более плохая практика: все, что связано с моим корневым окном, находится в глобальной области видимости! Yay!), И поскольку функции обратного вызова не возвращают значения, я передаю этот список в качестве аргумента к моей функции «загрузить окно набора тайлов», котораятогда передает аргумент в функцию create tileset (вызываемую, когда вы нажимаете соответствующую кнопку в окне), где это действительно необходимо, чтобы я мог добавить свой недавно созданный набор плиток в список. Передача аргументов через такую «иерархию» функций кажется ужасной идеей. Это сбивает с толку, это ужасно для написания модульного кода, и, как правило, кажется ненужным.

Моя попытка исправить проблему - написать класс, представляющий весь GUI, и пользовательские классы окон (которые класс GUI может создавать и ссылаться на них), которые действительно могут хранить соответствующие данные. Это должно решить проблемы с передачей данных между окнами. Надеюсь, это сократит мое бесплатное использование лямбда-функций в обратных вызовах. Но мне интересно: это лучший способ? Или хотя бы близко? Я бы предпочел не начинать переписывать, а потом заканчивать с другой системой, которая просто неаккуратна и по-другому сбивает с толку. Я знаю, что мои методы плохие, но я не знаю, какой будет лучший подход. Я получаю много советов о том, как делать конкретные вещи, но не о том, как структурировать программу в целом. Любая помощь будет принята с благодарностью.

Ответы на вопрос(1)

Ваш ответ на вопрос