14

我正在尝试使用 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) 行,以便程序暂停直到按键?

其他线程中建议的一些方法会暂停程序,但图片会消失或不更新。

4

5 回答 5

58

有什么理由不使用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()

正如它所说,这将等待按键或按钮按下以发生某些事情。如果您想了解有关事件的更多信息,它会返回值。好简单。

于 2014-11-21T22:53:39.110 回答
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
于 2013-03-23T04:45:57.497 回答
1

您可以等到用户按下回车键raw_input()

为了显示图表,plt.ion()应在导入后添加。

我认为没有任何简单的独立于平台的方法可以等待在 Python 中按下某个键,但如果 Enter 还不够,您可能需要检查一下。

于 2013-03-23T03:51:51.157 回答
1

plt.waitforbuttonpress() 只要按下一个键或单击鼠标,就会退出非活动状态。但是,如果按下键盘键,则该函数返回 True,如果单击鼠标,则返回 False。

要保持绘图直到按下键盘键:

keyboardClick=False
while keyboardClick != True:
    keyboardClick=plt.waitforbuttonpress()
于 2018-09-09T04:18:17.330 回答
0

你可以plt.pause(1)drawGraph()plt.ginput()

检查文档

matplotlib.pyplot.ginput(n=1, timeout=30, show_clicks=True, mouse_add=<MouseButton.LEFT: 1>, mouse_pop=<MouseButton.RIGHT: 3>, mouse_stop=<MouseButton.MIDDLE: 2>)

阻止与图形交互的调用。

等到用户在图上点击n次,并以列表的形式返回每次点击的坐标。

于 2021-06-18T12:28:29.043 回答