我在用tkinter建一个井字游戏界面。每个细胞是一个框架,我希望能够集中在其中任何使用鼠标。
以下是我尝试的:
import tkinter as tk
def on_event(event, target):
target.focus()
print(target)
class Example(tk.Tk):
def __init__(self):
super().__init__()
self.frames = []
self.main = tk.Frame(self, bg = "black")
self.build_widgets()
self.main.pack()
def build_widgets(self):
for i in range(3):
self.frames.append([])
for j in range(3):
newframe = tk.Frame(self.main, bg='white', width=50, height=50,
highlightcolor="blue", highlightthickness=1)
self.frames[i].append(newframe)
self.frames[i][j].bind("<Enter>",
lambda event : on_event(event, self.frames[i][j]))
self.frames[i][j].grid(row=i, column=j, padx = 1, pady = 1)
Example().mainloop()
这确实可以检测从一个帧到另一个帧的转换,但由于某种原因,它似乎只记得最后创建的帧(打印为.!frame.!frame9
)。为什么右下角的单元格是唯一获得焦点的单元格?
我认为原因是在循环结束时i = j = 2,所以一旦循环结束,target
就是self.frame[2][2]
,但情况似乎并非如此。
提前感谢任何答案。
1条答案
按热度按时间vq8itlhq1#
你不需要给函数传递参数。该函数传递了一个对象,该对象可以告诉您哪个小部件收到了事件。
首先,将您的绑定更改为:
接下来,将函数改为:
如果需要在循环中创建小部件,并将参数传递给绑定,请参阅tkinter creating buttons in for loop passing command arguments的答案