python-3.x 如何动态聚焦鼠标光标下的小部件?

jecbmhm3  于 2023-05-08  发布在  Python
关注(0)|答案(1)|浏览(93)

我在用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],但情况似乎并非如此。
提前感谢任何答案。

vq8itlhq

vq8itlhq1#

你不需要给函数传递参数。该函数传递了一个对象,该对象可以告诉您哪个小部件收到了事件。
首先,将您的绑定更改为:

self.frames[i][j].bind("<Enter>", on_event)

接下来,将函数改为:

def on_event(event):
    event.widget.focus()
    print(event.widget)

如果需要在循环中创建小部件,并将参数传递给绑定,请参阅tkinter creating buttons in for loop passing command arguments的答案

相关问题