На самом деле, это не так уж и плохо. На самом деле это довольно специфично и немного сложно.
Я расскажу вам, как начать, но когда вы начинаете (и вы не опубликовали какой-либо конкретный код), вам лучше будет создать код самостоятельно, основываясь на документации и моих подсказках. .
Кстати, посмотрите официальную документацию PyGTK - которая должна стать вашим окончательным источником для всех объектов и функций PyGTK. Это очень хорошо написано и исчерпывающе, и мне редко приходится искать больше пяти минут, чтобы найти то, что мне нужно.
Я предлагаю вам использовать три сигнала, связанных с вашей областью рисования.
Создайте три обратных вызова ( учебник здесь ), по одному для каждого события. Соедините свою область рисования с вашими событиями и обратными вызовами (опять же, см. Учебное пособие. Возможно, вам придется просмотреть несколько страниц).
Вам также понадобится создать две булевы переменные на глобальном уровне (над основным классом, на том же уровне, на котором вы импортируете модули). Первый контролирует, выбран ли инструмент выбора (назовите его «Select_On»), и второй, если он активен (назовите его «Select_Active»)
На кнопке, которую вы используете для запуска инструмента выбора, установите «Select_On» в «True». Вероятно, это должна быть кнопка переключения, поэтому убедитесь, что вы установили ее так, чтобы «Select_On» был выключен, если вы выключаете кнопку.
При нажатии кнопки-события создайте объект для выбора. То, с чем ты идешь сейчас, должно работать хорошо. Также установите для «Select_Active» значение «True».
В motion-notify-event измените размер вашего объекта в зависимости от положения курсора. Обратитесь к этой документации для этого конкретного вида объекта, чтобы узнать, как изменить его размер, и обратитесь к здесь , чтобы узнать, как получить позицию курсора.
Будьте готовы написать алгоритм, чтобы определить, как изменить размер объекта выделения на основе позиции курсора. Если вам нужна помощь в этом, не стесняйтесь спрашивать об этом в отдельном вопросе.
Для события button-release, установите «Select_Active» на «False» и вызовите весь свой код для фактического подтверждения выбора.
Кроме того, преимущество "motion-notify-event" состоит в том, что как только курсор покидает виджет, в котором вы выбираете, поле выбора прекращает изменять размеры. Курсор должен повторно войти в виджет, чтобы продолжить изменение размера поля выбора.
Я надеюсь, что все это работает для вас, и желаю вам всего наилучшего в вашем проекте!