Tkinter Canvas - 如何在多个对象跨越的区域创建事件(Python2)
我想在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>
事件发生在另一个有相同标签的区域,就取消关闭操作。