Tkinter привязывает щелчок только на холсте, а не на объектах

#python #tkinter

#python #tkinter

Вопрос:

Итак, у меня есть код:

 canvas.tag_bind(stvorec, '<Button-1>', clicked)
canvas.bind('<Button-1>', fail)
 

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

Ответ №1:

Затем вы можете использовать only .bind() и проверять, нажат ли элемент canvas или нет внутри обратного вызова bind:

 score = 0

def fail(event):
    global score
    # get ID of "current" item using .find_withtag()
    if canvas.find_withtag("current"):
        # a canvas item is clicked
        score  = 1
    else:
        score -= 1

...

canvas.bind("<Button-1>", fail)
 

Ответ №2:

Кроме того, вы также можете попробовать использовать флаг

 from tkinter import *

class Score:
    def __init__(self):
        self.score=0
        self.item_clicked=False

    def canvas(self,event):
        if not self.item_clicked:
            self.score-=1
        else:
            self.score =1
            self.item_clicked=False
        print(self.score)

    def item(self,event):
        self.item_clicked=True

    def get(self):
        return self.score

root=Tk()

canvas=Canvas(root)
canvas.pack()

text_id=canvas.create_text(200,100,text='Hello World')

score=Score()
canvas.tag_bind(text_id,'<Button-1>',score.item)
canvas.bind('<Button-1>',score.canvas)

root.mainloop()
 

Ответ №3:

Первая вызванная функция должна возвращать str ‘break’, чтобы остановить цепочку событий.

Комментарии:

1. Это тоже была моя первая идея, но я пробовал это, и это не сработало

2. @j_4321 Вы пробовали использовать обе функции? В соответствии с доками, сначала будут запущены наиболее конкретные.

3. Возврат «break» не повлияет на привязки, связанные с тегами canvas. Из официальной документации canvas: «Если привязки были созданы для окна холста с помощью команды bind, то они вызываются в дополнение к привязкам, созданным для элементов холста с помощью команды bind widget . Привязки для элементов будут вызваны перед любой из привязок для окна в целом «.