Как указать полный клик в Python Tkinter - PullRequest
1 голос
/ 01 сентября 2010

Следующая строка Python привязывает метод «click» к событию, когда пользователь нажимает кнопку мыши, когда указатель находится на виджете; независимо от того, где находится указатель, когда она отпускает кнопку.

self.bind('<Button-1>',self.click)

Если я использую «ButtonRelease» вместо «Button» в коде, кажется, что метод «click» будет вызван для виджета , на котором была нажата мышь после отпускания кнопки; независимо от того, где вы выпустите его.

1 - Нет ли изящного способа заставить его вызывать связанный метод, только если кнопка мыши была отпущена на моем виджете; независимо от того, где она была нажата?

2 - Разве нет точного способа заставить его реагировать только в случае полного щелчка (нажмите и отпустите оба на одном виджете)?

Ответы [ 3 ]

5 голосов
/ 01 сентября 2010

1- Разве нет аккуратного способа сделать это вызывать связанный метод, только если кнопка мыши была отпущена на моем виджет; не важно где это было нажимается

2- Разве нет аккуратного способа сказать это реагировать только в случае полного клика (нажмите и отпустите оба виджет)

Нет "аккуратного" способа, потому что, как говорит Ткинтер документы , говорят:

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

и оба ваших желания несовместимы с этим автоматическим захватом указателя мыши при нажатии вниз (что я не знаю, как отключить - я думаю, что это невозможно отключить, но доказать отрицание сложно; -.)

Итак, вам нужно больше работы и не «аккуратное» решение: при обратном вызове события при нажатии кнопки привязать события ввода и выхода (к связанным методам экземпляра класса, где вы можете отследить, находится ли мышь в данный момент). внутри или внутри интересующего виджета) этого окна, а также кнопки-релиза; таким образом, когда наступает событие release, вы знаете, выполнять ли «реальный обратный вызов приложения» (если внутри) или ничего не делать (если снаружи) - это дает вам ваше желание номер 2, но описание этого как аккуратного было бы натяжкой .

Желание номер 1 еще сложнее, потому что вы должны отслеживать вход и выходить из событий на КАЖДОМ виджете интереса - недостаточно знать один бит, находится ли мышь внутри или снаружи, а вы должны отслеживать, какой виджет (если есть), в котором он находится в данный момент, для правильного (если вообще) направления «фактического обратного вызова приложения» во время отпускания кнопки.

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

4 голосов
/ 01 сентября 2010

Документация tkinter предоставляет вам информацию об этом: http://www.pythonware.com/library/tkinter/introduction/events-and-bindings.htm

Вы можете сделать привязку к

<ButtonRelease-1>
1 голос
/ 14 июня 2012

Связывание с ButtonRelease-1 недостаточно. Обратный вызов не сработает, пока кнопка не будет отпущена, но не имеет значения, где находится мышь, когда она отпущена. То, что управляет, - то, где мышь была, когда она была нажата, как сказал Алекс Мартелли. Простой способ получить желаемое поведение - поместить все на холст и связать обратный вызов с ButtonRelease-1. Теперь у вас есть что-то вроде

def callback(event):
    x1, y1, x2, y2 = canvas.bbox(widget)
    if x1 <= event.x <= x2 and y1 <= event.y <= y2:
         <whatever>

Я использовал этот подход в своем собственном коде, чтобы заставить произвольные виджеты вести себя как кнопки в этом отношении.

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