#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 . Привязки для элементов будут вызваны перед любой из привязок для окна в целом «.