如何暂停pylab图形直到按下键或点击鼠标?

16 投票
5 回答
35830 浏览
提问于 2025-04-17 20:02

我正在用pylab和networkx编写一个动画模拟程序。这个模拟并不是一直都很有趣,所以大部分时间我希望它运行得快一些。不过,当它变得有趣时,我想暂停一下,好好看看。通过在按下键之前暂停屏幕,可以解决我的问题,因为我可以根据自己的需要快慢地按键。

这里有一个例子:

import numpy as np
import networkx as nx
import pylab as plt
import sys

def drawGraph(matrix):
    plt.clf()
    G = nx.DiGraph(np.array(matrix))
    nx.draw_networkx(G)
    plt.draw()

    plt.pause(1) #I want this pause to be replaced by a keypress
    #so that it pauses as long as I want

A=[[0,1],[1,0]]
B=[[0,1],[0,0]]
x=1
while True:
    if x==1:
        drawGraph(A)
        x=0
    else:
        drawGraph(B)
        x=1

我应该怎么改写plt.pause(1)这一行,让程序在按下键之前一直暂停呢?

在其他讨论中提到的一些方法虽然能暂停程序,但画面要么消失,要么不更新。

5 个回答

3

plt.waitforbuttonpress() 这个函数会在你按下键盘的某个键或者点击鼠标的时候退出等待状态。不过,如果是按下键盘,它会返回 True;如果是点击鼠标,它会返回 False。

如果你想让图像保持显示,直到你按下键盘的某个键,可以使用以下代码:

keyboardClick=False
while keyboardClick != True:
    keyboardClick=plt.waitforbuttonpress()
61

有没有什么原因不使用waitforbuttonpress()这个函数呢?

import matplotlib.pyplot as plt

A=[[0,1],[1,0]]
B=[[0,1],[0,0]]
x=1
while True:
    if x==1:
        drawGraph(A)
        x=0
    else:
        drawGraph(B)
        x=1
    plt.waitforbuttonpress()

这个函数的意思就是,它会等待你按下一个键或者按钮,然后才会继续执行后面的操作。如果你想了解更多关于这个按键事件的信息,它还会返回一些值。用起来非常简单。

7

下面的代码可以通过鼠标点击来暂停和重新开始。它使用的是"TKAgg"这个后端:

import numpy as np
import networkx as nx
import matplotlib
matplotlib.use("TkAgg")

import pylab as plt
plt.ion()

fig = plt.figure()

pause = False

def onclick(event):
    global pause
    pause = not pause

fig.canvas.mpl_connect('button_press_event', onclick)

def drawGraph(matrix):
    fig.clear()
    G = nx.DiGraph(np.array(matrix))
    nx.draw_networkx(G)
    plt.draw()

A=[[0,1],[1,0]]
B=[[0,1],[0,0]]
x=1
while True:
    if not pause:
        if x==1:
            drawGraph(A)
            x=0
        else:
            drawGraph(B)
            x=1
    fig.canvas.get_tk_widget().update() # process events

撰写回答