Tkinter Canvas - 如何在多个对象跨越的区域创建事件(Python2)

0 投票
1 回答
599 浏览
提问于 2025-04-18 16:34

我想在tkinter中创建一个事件,让多个矩形被当作一个矩形来处理。之前我给这三个矩形都加了相同的标签,并把事件(进入和离开)绑定到这个标签上,但问题是每次我把鼠标从一个矩形移动到另一个矩形时,它都会分别触发进入和离开的事件,尽管它们是相连的。

因为我在进入时会弹出一个窗口,而在离开时会把它关闭,所以不断地创建和销毁同一个窗口会影响用户体验(而且内容生成大约需要半秒钟)。

我该如何创建一个事件,让多个相连的矩形像一个对象一样响应呢?

这是我到目前为止尝试过的代码,去掉了与这个问题无关的内容:

    import Tkinter as Tk

    class PopupBox:

        def __init__(self):
            self._master = Tk.Tk()

            self._popup = Tk.Toplevel()
            self._popup.destroy()

            self._canv = Tk.Canvas(self._master)
            self._canv.pack()

            self._canv.create_rectangle((50,50,100,100), fill='green', outline='', tags='test')
            self._canv.create_rectangle((50,100,100,150), fill='yellow', outline='', tags='test')
            self._canv.create_rectangle((50,150,100,200), fill='red', outline='', tags='test')

            self._canv.tag_bind('test', '<Enter>', self.enter)
            self._canv.tag_bind('test', '<Leave>', self.leave)

            self._master.mainloop()

        def enter(self, event):
            if self._popup.winfo_exists() == 1:
                self._popup.destroy()
            self._popup = Tk.Toplevel(self._master)
            self._popup.geometry('+%d+%d' % (event.x_root + 50, event.y_root + 50))

        def leave(self, event):
            if self._popup.winfo_exists():
                self._popup.destroy()

if __name__ == '__main__':

    x = PopupBox()

这里有一个类似的问题,但它没有我需要的答案,因为它把事件绑定到了整个画布上:

如何创建一个响应点击事件的透明矩形

1 个回答

0

我觉得一个比较简单的解决办法是,不要立刻关闭弹出窗口。可以设置一个短暂的延迟,比如200到500毫秒后再删除它。如果在这段时间内,检测到有<Enter>事件发生在另一个有相同标签的区域,就取消关闭操作。

撰写回答