我想通过使用matplolib
中的一些按钮来控制某些函数的执行。 我想暂停的功能,这是在我的情况下,打破了循环的执行,对于我用我的脚本如下:Python - 打破外部函数的循环
def pause(mouse_event):
global pauseVal
pauseVal ^= True
def play(mouse_event):
for x in range(int(dataSlider.val),len(listOfMomentsVis)):
if pauseVal == True:
break
else:
image.set_data(listOfMomentsVis[x])
fig.canvas.draw()
dataSlider.set_val(x+1)
time.sleep(timeSleep)
print(x)
发生了什么事是,该功能不会执行下次我尝试执行它时,执行时不是。换句话说,pause
按钮在下次执行之前不会生效。
我的问题是:如何通过外部按钮事件中断执行中的for循环? 这是可行的还是应该是其他方式? (可以使for循环listen
到外部函数?!)
PS:我发现以下问题具有相同的标题,How to break a loop from an outside function,但是,答案是根据循环中的值打破,而不是一个值从外面。
updae
这里是脚本我更新版本。我考虑了评论和答案,上了一堂课,仍然没有得到预期的结果。
class animationButtons():
def __init__(self):
self.pauseVal = False
def backward(self, mouse_event):
ref = int(dataSlider.val)
if ref-1<0:
print('error')
else:
image.set_data(listOfMomentsVis[ref-1])
dataSlider.set_val(ref-1)
def forward(self, mouse_event):
ref = int(dataSlider.val)
if ref+1>len(listOfMomentsVis):
ref = int(dataSlider.val)-1
print('error')
else:
image.set_data(listOfMomentsVis[ref])
dataSlider.set_val(ref+1)
print('from forward', dataSlider.val)
def play(self, mouse_event):
for x in range(int(dataSlider.val),len(listOfMomentsVis)):
ref = int(dataSlider.val)
dataSlider.set_val(ref+1)
time.sleep(timeSleep)
print('from play',ref)
if self.pauseVal:
break
def playReverse(self, mouse_event):
for x in range(int(dataSlider.val),0,-1):
ref = int(dataSlider.val)
dataSlider.set_val(ref-1)
time.sleep(timeSleep)
print('from play',ref)
if self.pauseVal:
break
def pause(self, mouse_event):
self.pauseVal ^= True
print(self.pauseVal)
def animate(self, val):
ref = int(dataSlider.val)
image.set_data(listOfMomentsVis[ref])
print('from animate',ref)
fig.canvas.draw()
听起来像你的问题真的在于你正在一个线程中执行所有的事情。您通常需要一个单独的线程来处理鼠标点击(和其他UI操作)。在这种情况下,你的解决方案应该工作(ish)。 – acdr