2016-06-12 113 views
1

我试图用一些方法绑定鼠标运动(按下/未按下)。 我试图处理鼠标的动作,而鼠标按钮用''键和另一只用''键。 我发现,当我刚刚有..bind('',somemethod1),somemethod1被称为不管鼠标按钮按下,但是当我也有..bind('',somemethod2),somemethod1不被称为鼠标按钮时按下。 添加'add ='+''似乎不起作用。tkinter最大递归深度超过生成事件

def bind_mouse(self): 
    self.canvas.bind('<Button1-Motion>', self.on_button1_motion1) 
    self.canvas.bind('<Motion>', self.on_mouse_unpressed_motion1) 

def on_button1_motion1(self, event): 
    print(self.on_button1_motion1.__name__) 

def on_mouse_unpressed_motion1(self, event): 
    print(self.on_mouse_unpressed_motion1.__name__) 

所以我代替修改为以下on_button1_motion1方法:

def on_button1_motion1(self, event): 
    print(self.on_button1_motion1.__name__) 
    self.canvas.event_generate('<Motion>') 

但是,当我尝试这样做,我得到这个运行时错误:

回溯(最近通话最后一个): 文件“D:/ save/WORKSHOP/py/tkinter/Blueprints/Pycrosoft Paintk/view.py”,第107行,在 root.mainloop() 文件“C:\ Users \ smj \ AppData \ Local \ Programs \ Python \ Python35 \ lib \ tkinter__init __。py“,第1131行,在mainloop中 self.tk.mainloop(n) 递归错误:超过最大递归深度

任何人都可以向我解释为什么会发生这种情况吗? 我知道我可以通过调用on_button1_motion1方法内的on_button1_motion1方法而不是生成事件来解决此问题,但我想知道为什么其他方式不起作用。谢谢

回答

2

它创建一个无限循环。

您现在收听的<Button1-Motion>,当你得到它,你创造更多的<Motion>当按下按钮(因为它时,抓住了按钮1事件仅生成)。所以你正在生成另一个<Button1-Motion>事件。所以函数再次被调用,等等。

<Motion>

The mouse is moved with a mouse button being held down. To specify the left, middle or right mouse button use <B1-Motion> , <B2-Motion > and <B3-Motion> respectively.

...

here

+0

嗯,你的意思是当我在听''Button1-Motion>'事件时创建''事件,on_button1_motion1因为“侦听寄存器”而被调用?有趣。我从来不知道这一点。 –

+0

当侦听该事件的命令(方法)执行时(返回之前)是否“侦听”? –

+0

对不起,我犯了一个错误:''并不总是触发''的回调。我重新创建了你的程序并发现了相同的行为。问题在于当按钮已经被按下时产生''事件**产生另一个''事件(因为按钮被按下并且你正在产生Motion!)。回答最后一个问题:是的,在执行回调函数'on_button1_motion1'时,小部件仍在侦听更多事件,并且在按下按钮时又创建了另一个''事件,因此它是'< Button1的迅>”。 – krork