Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python LeftIsDown不切换_Python_Wxpython_Wxwidgets - Fatal编程技术网

Python LeftIsDown不切换

Python LeftIsDown不切换,python,wxpython,wxwidgets,Python,Wxpython,Wxwidgets,我是一个新手,尝试组合一个小测试程序,其中EVT_LEFT_DOWN事件绑定到静态位图,如下所示: wx.EVT_LEFT_DOWN(imageBitmap, image_click_handler) 图像\u单击处理程序如下所示: image_click_handler(self): self.Skip() while self.LeftIsDown(): Do something 基本上,我试图在单击图像时实现拖动。但是,self.LeftIsDown()方

我是一个新手,尝试组合一个小测试程序,其中EVT_LEFT_DOWN事件绑定到静态位图,如下所示:

wx.EVT_LEFT_DOWN(imageBitmap, image_click_handler)
图像\u单击处理程序如下所示:

image_click_handler(self):
    self.Skip()
    while self.LeftIsDown():
       Do something
基本上,我试图在单击图像时实现拖动。但是,self.LeftIsDown()方法从不返回false,这会导致无限循环


我觉得我在做一些非常愚蠢的事情。我一直在关注这里的文档(),它是针对WxPython的旧版本(我使用的是3.0.0.0)。也许这是一个问题?

wxPython是一个事件驱动的环境。当有人按下鼠标左键时,会调用事件处理程序,在事件处理程序完成之前,不会有其他事件进入程序。您的程序无法意识到按钮的释放,因为所有新事件都卡在队列中,等待处理程序返回。通常,在事件处理程序中,使用类似于无限循环的任何东西都是危险的


解决方案通常分为几个部分:(1)设置计时器以发送周期性事件,但不要启动它。(2) 在init_click_处理程序中,启动此计时器并返回。(3) 编写一个计时器事件处理程序,其中每个事件“执行一次”。(4) 当您得到一个EVT时,您可以停止计时器(另一个事件处理程序),或者您也可以检查计时器事件处理程序中的LeftIsDown()并在计时器为False时停止计时器。

Hmm…也许我应该详细说明“做点什么”实际上是什么。本质上,我有一个图像,我想在上面“画画”,除了,我想,比如说,把我画的像素的红色值相加,而不是在上面画画。你认为有没有更好的方法不用计时?我可以看到如何根据您所说的来实现它(button down事件切换一个标志,然后让一个mouse_move事件累积值,只要设置了标志,然后当鼠标上升时,关闭标志)。这似乎有点混乱。而且,现在我想起来了,你的解释对我来说没有意义。LeftIsDown()似乎是一个读取状态而不是事件的方法。尽管如此,我还是很感激你的帮助:)保罗,所以我听从了你的建议,效果很好。谢谢仍然希望有人能找到更好的方法…在我的解决方案中使用显式关键字global感觉非常奇怪。从函数LeftIsDown()的wx文档中:“wxMouseEvent::LeftIsDown bool LeftIsDown())如果鼠标左键当前处于按下状态,const返回true,与当前事件类型无关。请注意,它与LeftDown不同,如果事件是由按下鼠标左键生成的,则LeftDown返回true。相反,它只是描述生成事件时鼠标左键的状态(因此,尽管左键单击事件是正确的,但如果鼠标左键按下,右键单击也可能是正确的)。“在我概述的方案中,计时器事件仅在左键向下事件和左键向上事件之间发出,因此我不明白为什么需要变量(更不用说全局变量了)告诉你,添加计时器也没什么大不了的;没有计时器,编写一个有用的事件驱动程序几乎是不可能的。