我正在尝试制作记忆游戏,我有一个叫做“按钮”的课程。
tk = Tk()
tk.title('Memory Game')
tk.wm_attributes('-topmost', 1)
tk.resizable(0, 0)
canvas = Canvas(tk, width=400, height=600, bg='white', bd=0,
highlightthickness=0)
canvas.pack()
tk.update()
class Button:
def __init__(self, pos):
self.pos = pos
self.open = False
self.canvas = canvas
self.id = canvas.create_rectangle(pos[0], pos[1], pos[0]+100, pos[1]+100, fill='blue')
self.canvas.bind_all("<Button-1>", self.action)
print(self.pos)
#The positions are what they're supposed to be as of now.
def action(self, event):
print(self.pos)
#If you click on the screen, then the console prints out [300, 400] no matter what the actual position is.
print(event.x, event.y) #Prints out coords of where the mouse clicked
if event.x >= self.pos[0] and event.x <= self.pos[0] + 100:
if event.y >= self.pos[1] and event.y <= self.pos[1]+100:
self.canvas.coords(self.id, 1000, 1000, 1100, 1100)
#Makes Button Disappear from Tkinter Window
button_pos = [[0, 100], [0, 200], [0, 300], [0, 400], [100, 100], [100, 200], [100, 300], [100, 400], [200, 100], [200, 200], [200, 300], [200, 400], [300, 100], [300, 200], [300, 300], [300, 400]]
//coordinates for the buttons
buttons = []
for x in range(16):
buttons.append(Button(button_pos[x]))
如果你运行它并点击屏幕,你会看到按钮的位置似乎总是[300,400],无论如何。为什么会这样?除了右下角按钮之外,没有任何按钮实际消失。
答案 0 :(得分:0)
问题在于:
self.canvas.bind_all("<Button-1>", self.action)
每个按钮都会尝试接管整个画布的所有Button-1
事件 - 实际上,因为您正在使用bind_all
,因为应用中的所有小部件都可以使用。因此,每个人都会窃取之前的绑定,最后,最后一个按钮会获得所有点击。
您要做的是让 canvas 绑定按钮,然后点击测试点击,然后手动将其传递给矩形。例如,在所有现有代码之后(但在开始主循环之前),添加:
def action(event):
item, = canvas.find_closest(event.x, event.y)
buttons[item-1].action(event)
canvas.bind("<Button-1>", action)
然后删除self.canvas.bind_all
行。现在,画布获得自己的点击次数,找到与点击最接近的形状(按创建顺序为矩形的一个基础索引),并手动调度事件。