Tkinter活跃状态

时间:2017-04-03 22:24:54

标签: python python-3.x tkinter

我想要做的是检测鼠标是否已移动到屏幕上的对象上,如果有,我想在单独的框架中显示有关该对象的数据。不允许鼠标单击,只有鼠标移动,就像有效宽度一样。我没有看到和引用任何显示内置功能的内容,这将允许我正在尝试做的事情。我错了,如果是的话我还没看到什么。不能进一步研究我不知道的事情。

编辑:当我在画布上引用绘制的形状时,我确实使用了坏词Object。这些是布置在画布上的线,也就是映射程序。当我滚动一条线/道路时,我希望它在一个单独的框架上弹出道路的名称。当我滚动业务的符号时,我希望它在单独的框架中显示业务名称和其他相关信息。因此,为什么我说activewidth是我基本上试图模仿它捕获鼠标位置然后自动识别鼠标指针所在的屏幕下面的东西。如果我可以捕获相同的指针引用...现在,因为我正在编辑它,我想我将不得不创建具有自己的单独引用名称的每一行......

z[0] = self.canvas.create_line()
z[1] = self.canvas.create_line()
z[2] = self.canvas.create_line()

等。这个想法我错了吗?有没有更简单的方法呢?

3 个答案:

答案 0 :(得分:0)

您可以绑定到<Enter><Leave>事件,只要鼠标进入或离开窗口小部件就会触发事件。

实施例

import tkinter as tk

root = tk.Tk()

l1 = tk.Label(root, text="Hover over me", 
              width=40, bd=2, relief="groove",
              background="lightblue")
l2 = tk.Label(root)
l1.pack(side="top", fill="x", padx=10, pady=10)
l2.pack(side="top", fill="both", expand=True)

def handle_enter(event):
    event.widget.configure(background="pink")
    l2.configure(text="you entered the widget")
def handle_leave(event):
    event.widget.configure(background="lightblue")
    l2.configure(text="")

l1.bind("<Enter>", handle_enter)
l1.bind("<Leave>", handle_leave)

root.mainloop()

答案 1 :(得分:0)

如果对象是tkinter小部件,请绑定到import Tkinter as tk class GUI(tk.Frame): def __init__(self, master=None, **kwargs): tk.Frame.__init__(self, master, **kwargs) lbl = tk.Label(text='Label 1') lbl.pack() lbl.bind('<Motion>', self.motion_detected) lbl = tk.Label(text='Thing B') lbl.pack() lbl.bind('<Motion>', self.motion_detected) def motion_detected(self, event): print('motion detected in {} at {},{}'.format(event.widget['text'], event.x, event.y)) def main(): root = tk.Tk() root.geometry('200x200') win = GUI(root) win.pack() root.mainloop() if __name__ == '__main__': main() 。它只会在鼠标移动到您绑定的对象(或它的子对象)上时触发。事件对象将包含有关您所在的对象甚至对象本身的信息。

{{1}}

答案 2 :(得分:0)

使用CURRENT标记,您可以匹配鼠标下的canvas元素

  

CURRENT(或“current”)匹配鼠标指针下的项目if   任何。这可以在鼠标事件绑定中使用以引用该项目   这引发了回调。

source

所以,

首先通过标签选项

传递您的信息
self.canvas.create_line(.... tags="road1")

然后绑定到<Motion>事件,在处理程序内部获取当前ellement的标记

ellement_id = canvas.find_withtag(CURRENT)
ellement_tags = canvas.gettags(ellement_id)