精华内容
下载资源
问答
  • 绘制流程图, 自动生成python代码, 支持tkinter可视化编程 很多人不明白可以做什么用。这个项目(包括这个系列的其它项目)主要用于大型复杂项目的代码工作。 程序员在完成代码过程中,可能有很多的自由式发挥,这...

    拥抱开源! 第一弹

    https://github.com/fenglinyushu/autocode-python

    绘制流程图, 自动生成python代码, 支持tkinter可视化编程

    很多人不明白可以做什么用。这个项目(包括这个系列的其它项目)主要用于大型复杂项目的代码工作。

    程序员在完成代码过程中,可能有很多的自由式发挥,这极大地提高了效率,也较好地完成了领导交给的工作。

    其实潜在的问题是相应文档的同步完成,以及后续持续开发和维护的难度。

    我是一个20年经验的程序员,有点太老了!:),算是有经验了。在间隔一段时间再看自己的代码时,往往也需要很多时间来理解和找回当时的思路。如果需要修改,会变得十分小心翼翼。

    如果换一个人来维护,可能就会是传说中的的“屎山”了

    采用AutoCode来完成代码主要就是为了解决上述问题,边绘制流程,边生成代码。这样代码完成时,流程文档也完成了。(AutoCode后续会支持导出到Word/Visio/SVG/BMP)。同时由于流程树节点每个节点都可以展开、合拢,

    这样即可以合拢子节点,从而宏观在了解大段程序的基本框架,也可以展开子节点,查看具体的代码细节

    AutoCode系列从根本上是解决编程的标准化问题,希望能有用!

    欢迎交流! 欢迎到github去star! fork!

    展开全文
  • 使用graphviz绘制流程图

    千次阅读 2016-04-08 10:56:20
    写博客或者论文, 经常要画图来展示思路, 但是Visio有些时候太重, 我只希望根据我的输入,自动帮我把布局搞定, 不需要我拖拽. 而且最好存为文本格式, 不占地方, 修改方便. 最近发现一个比较有意思的软件, 正好满足我的...

    写博客或者论文, 经常要画图来展示思路, 但是Visio有些时候太重, 我只希望根据我的输入,自动帮我把布局搞定, 不需要我拖拽. 而且最好存为文本格式, 不占地方, 修改方便. 最近发现一个比较有意思的软件, 正好满足我的需求, 就是这篇转载文章的主角:graphviz


    前言

    日常的开发工作中,为代码添加注释是代码可维护性的一个重要方面,但是仅仅提供注释是不够的,特别是当系统功能越来越复杂,涉及到的模块越来越多的时候,仅仅靠代码就很难从宏观的层次去理解。因此我们需要图例的支持,图例不仅仅包含功能之间的交互,也可以包含复杂的数据结构的示意图,数据流向等。

    但是,常用的UML建模工具,如VISIO等都略显复杂,且体积庞大。对于开发人员,特别是后台开发人员来说,命令行,脚本才是最友好的,而图形界面会很大程度的限制开发效率。相对于鼠标,键盘才是开发人员最好的朋友。

    graphviz简介

    本文介绍一个高效而简洁的绘图工具graphviz。graphviz是贝尔实验室开发的一个开源的工具包,它使用一个特定的DSL(领域特定语言):dot作为脚本语言,然后使用布局引擎来解析此脚本,并完成自动布局。graphviz提供丰富的导出格式,如常用的图片格式,SVG,PDF格式等。

    graphviz中包含了众多的布局器:

    1. dot 默认布局方式,主要用于有向图
    2. neato 基于spring-model(又称force-based)算法
    3. twopi 径向布局
    4. circo 圆环布局
    5. fdp 用于无向图

    graphviz的设计初衷是对有向图/无向图等进行自动布局,开发人员使用dot脚本定义图形元素,然后选择算法进行布局,最终导出结果。

    首先,在dot脚本中定义图的顶点和边,顶点和边都具有各自的属性,比如形状,颜色,填充模式,字体,样式等。然后使用合适的布局算法进行布局。布局算法除了绘制各个顶点和边之外,需要尽可能的将顶点均匀的分布在画布上,并且尽可能的减少边的交叉(如果交叉过多,就很难看清楚顶点之间的关系了)。所以使用graphviz的一般流程为:

    1. 定义一个图,并向图中添加需要的顶点和边
    2. 为顶点和边添加样式
    3. 使用布局引擎进行绘制

    一旦熟悉这种开发模式,就可以快速的将你的想法绘制出来。配合一个良好的编辑器(vim/emacs)等,可以极大的提高开发效率,与常见的GUI应用的所见即所得模式对应,此模式称为所思即所得。比如在我的机器上,使用vim编辑dot脚本,然后将F8映射为调用dot引擎去绘制当前脚本,并打开一个新的窗口来显示运行结果:

    clip_image002

    对于开发人员而言,经常会用到的图形绘制可能包括:函数调用关系,一个复杂的数据结构,系统的模块组成,抽象语法树等。

    基础知识

    graphviz包含3中元素,图,顶点和边。每个元素都可以具有各自的属性,用来定义字体,样式,颜色,形状等。下面是一些简单的示例,可以帮助我们快速的了解graphviz的基本用法。

    第一个graphviz图

    比如,要绘制一个有向图,包含4个节点a,b,c,d。其中a指向b,b和c指向d。可以定义下列脚本:

    digraph abc{
    a;
    b;
    c;
    d;
     
    a -> b;
    b -> d;
    c -> d;
    }


    使用dot布局方式,绘制出来的效果如下:

    clip_image004

    图 1

    默认的顶点中的文字为定义顶点变量的名称,形状为椭圆。边的默认样式为黑色实线箭头,我们可以在脚本中做一下修改,将顶点改为方形,边改为虚线。

    定义顶点和边的样式

    在digraph的花括号内,添加顶点和边的新定义:

    node [shape="record"];
    edge [style="dashed"];


    则绘制的效果如下:

    clip_image006

    进一步修改顶点和边样式

    进一步,我们将顶点a的颜色改为淡绿色,并将c到d的边改为红色,脚本如下:

    digraph abc{
    node [shape="record"];
    edge [style="dashed"];
     
    a [style="filled", color="black", fillcolor="chartreuse"];
    b;
    c;
    d;
     
    a -> b;
    b -> d;
    c -> d [color="red"];
    }


    绘制的结果如下:

    clip_image008

    应当注意到,顶点和边都接受属性的定义,形式为在顶点和边的定义之后加上一个由方括号括起来的key-value列表,每个key-value对由逗号隔开。如果图中顶点和边采用统一的风格,则可以在图定义的首部定义node, edge的属性。比如上图中,定义所有的顶点为方框,所有的边为虚线,在具体的顶点和边之后定义的属性将覆盖此全局属性。如特定与a的绿色,c到d的边的红色。

    子图的绘制

    graphviz支持子图,即图中的部分节点和边相对对立(软件的模块划分经常如此)。比如,我们可以将顶点c和d归为一个子图:

    digraph abc{
     
    node [shape="record"];
    edge [style="dashed"];
     
    a [style="filled", color="black", fillcolor="chartreuse"];
    b;
     
        subgraph cluster_cd{
        label="c and d";
        bgcolor="mintcream";
        c;
        d;
        }
     
    a -> b;
    b -> d;
    c -> d [color="red"];
    }


    将c和d划分到cluster_cd这个子图中,标签为”c and d”,并添加背景色,以方便与主图区分开,绘制结果如下:

    clip_image010

    应该注意的是,子图的名称必须以cluster开头,否则graphviz无法设别。

    数据结构的可视化

    实际开发中,经常要用到的是对复杂数据结构的描述,graphviz提供完善的机制来绘制此类图形。

    一个hash表的数据结构

    比如一个hash表的内容,可能具有下列结构:

    struct st_hash_type {
        int (*compare) ();
        int (*hash) ();
    };
     
    struct st_table_entry {
        unsigned int hash;
        char *key;
        char *record;
        st_table_entry *next;
    };
     
    struct st_table {
        struct st_hash_type *type;
        int num_bins; /* slot count */
        int num_entries; /* total number of entries */
        struct st_table_entry **bins; /* slot */
    };

    绘制hash表的数据结构

    从代码上看,由于结构体存在引用关系,不够清晰,如果层次较多,则很难以记住各个结构之间的关系,我们可以通过下图来更清楚的展示:

    clip_image012

    脚本如下:

    digraph st2{
    fontname = "Verdana";
    fontsize = 10;
    rankdir=TB;
     
    node [fontname = "Verdana", fontsize = 10, color="skyblue", shape="record"];
     
    edge [fontname = "Verdana", fontsize = 10, color="crimson", style="solid"];
     
    st_hash_type [label="{<head>st_hash_type|(*compare)|(*hash)}"];
    st_table_entry [label="{<head>st_table_entry|hash|key|record|<next>next}"];
    st_table [label="{st_table|<type>type|num_bins|num_entries|<bins>bins}"];
     
    st_table:bins -> st_table_entry:head;
    st_table:type -> st_hash_type:head;
    st_table_entry:next -> st_table_entry:head [style="dashed", color="forestgreen"];
    }


    应该注意到,在顶点的形状为”record”的时候,label属性的语法比较奇怪,但是使用起来非常灵活。比如,用竖线”|”隔开的串会在绘制出来的节点中展现为一条分隔符。用”<>”括起来的串称为锚点,当一个节点具有多个锚点的时候,这个特性会非常有用,比如节点st_table的type属性指向st_hash_type,第4个属性指向st_table_entry等,都是通过锚点来实现的。

    我们发现,使用默认的dot布局后,绿色的这条边覆盖了数据结构st_table_entry,并不美观,因此可以使用别的布局方式来重新布局,如使用circo算法:

    clip_image014

    则可以得到更加合理的布局结果。

    hash表的实例

    另外,这个hash表的一个实例如下:

    clip_image016

    脚本如下:

    digraph st{
     
    fontname = "Verdana";
    fontsize = 10;
    rankdir = LR;
    rotate = 90;
     
    node [ shape="record", width=.1, height=.1];
    node [fontname = "Verdana", fontsize = 10, color="skyblue", shape="record"];
     
    edge [fontname = "Verdana", fontsize = 10, color="crimson", style="solid"];
    node [shape="plaintext"];
     
    st_table [label=<
        <table border="0" cellborder="1" cellspacing="0" align="left">
        <tr>
        <td>st_table</td>
        </tr>
        <tr>
        <td>num_bins=5</td>
        </tr>
        <tr>
        <td>num_entries=3</td>
        </tr>
        <tr>
        <td port="bins">bins</td>
        </tr>
        </table>
    >];
     
    node [shape="record"];
    num_bins [label=" <b1> | <b2> | <b3> | <b4> | <b5> ", height=2];
    node[ width=2 ];
     
    entry_1 [label="{<e>st_table_entry|<next>next}"];
    entry_2 [label="{<e>st_table_entry|<next>null}"];
    entry_3 [label="{<e>st_table_entry|<next>null}"];
     
    st_table:bins -> num_bins:b1;
    num_bins:b1 -> entry_1:e;
    entry_1:next -> entry_2:e;
    num_bins:b3 -> entry_3:e;
     
    }


    上例中可以看到,节点的label属性支持类似于HTML语言中的TABLE形式的定义,通过行列的数目来定义节点的形状,从而使得节点的组成更加灵活。

    软件模块组成图

    Apache httpd模块关系

    clip_image018

    IDPV2后台的模块组成关系

    在实际的开发中,随着系统功能的完善,软件整体的结构会越来越复杂,通常开发人员会将软件划分为可理解的多个子模块,各个子模块通过协作,完成各种各样的需求。

    下面有个例子,是在IDPV2设计时的一个草稿:

    clip_image020

    IDP支持层为一个相对独立的子系统,其中包括如数据库管理器,配置信息管理器等模块,另外为了提供更大的灵活性,将很多其他的模块抽取出来作为外部模块,而支持层提供一个模块管理器,来负责加载/卸载这些外部的模块集合。

    这些模块间的关系较为复杂,并且有部分模块关系密切,应归类为一个子系统中,上图对应的dot脚本为:


    状态图

    有限自动机示意图

    digraph idp_modules{
     
    rankdir = TB;
    fontname = "Microsoft YaHei";
    fontsize = 12;
     
    node [ fontname = "Microsoft YaHei", fontsize = 12, shape = "record" ]; 
    edge [ fontname = "Microsoft YaHei", fontsize = 12 ];
     
        subgraph cluster_sl{
            label="IDP支持层";
            bgcolor="mintcream";
            node [shape="Mrecord", color="skyblue", style="filled"];
            network_mgr [label="网络管理器"];
            log_mgr [label="日志管理器"];
            module_mgr [label="模块管理器"];
            conf_mgr [label="配置管理器"];
            db_mgr [label="数据库管理器"];
        };
     
        subgraph cluster_md{
            label="可插拔模块集";
            bgcolor="lightcyan";
            node [color="chartreuse2", style="filled"];
            mod_dev [label="开发支持模块"];
            mod_dm [label="数据建模模块"];
            mod_dp [label="部署发布模块"];
        };
     
    mod_dp -> mod_dev [label="依赖..."];
    mod_dp -> mod_dm [label="依赖..."];
    mod_dp -> module_mgr [label="安装...", color="yellowgreen", arrowhead="none"];
    mod_dev -> mod_dm [label="依赖..."];
    mod_dev -> module_mgr [label="安装...", color="yellowgreen", arrowhead="none"];
    mod_dm -> module_mgr [label="安装...", color="yellowgreen", arrowhead="none"];
     
    }


    clip_image022

    上图是一个简易有限自动机,接受a及a结尾的任意长度的串。其脚本定义如下:

    digraph automata_0 {
     
    size = "8.5, 11";
    fontname = "Microsoft YaHei";
    fontsize = 10;
     
    node [shape = circle, fontname = "Microsoft YaHei", fontsize = 10];
    edge [fontname = "Microsoft YaHei", fontsize = 10];
     
    0 [ style = filled, color=lightgrey ];
    2 [ shape = doublecircle ];
     
    0 -> 2 [ label = "a " ];
    0 -> 1 [ label = "other " ];
    1 -> 2 [ label = "a " ];
    1 -> 1 [ label = "other " ];
    2 -> 2 [ label = "a " ];
    2 -> 1 [ label = "other " ];
     
    "Machine: a" [ shape = plaintext ];
    }


    形状值为plaintext的表示不用绘制边框,仅展示纯文本内容,这个在绘图中,绘制指示性的文本时很有用,如上图中的”Machine: a”。

    OSGi中模块的生命周期图

    OSGi中,模块具有生命周期,从安装到卸载,可能的状态具有已安装,已就绪,正在启动,已启动,正在停止,已卸载等。如下图所示:

    clip_image024

    对应的脚本如下:

    digraph module_lc{
     
    rankdir=TB;
    fontname = "Microsoft YaHei";
    fontsize = 12;
     
    node [fontname = "Microsoft YaHei", fontsize = 12, shape = "Mrecord", 
    or="skyblue", style="filled"]; 
    edge [fontname = "Microsoft YaHei", fontsize = 12, color="darkgreen" ];
     
    installed [label="已安装状态"];
    resolved [label="已就绪状态"];
    uninstalled [label="已卸载状态"];
    starting [label="正在启动"];
    active [label="已激活(运行)状态"];
    stopping [label="正在停止"];
    start [label="", shape="circle", width=0.5, fixedsize=true, style="filled", 
    r="black"];
     
    start -> installed [label="安装"];
    installed -> uninstalled [label="卸载"];
    installed -> resolved [label="准备"];
    installed -> installed [label="更新"];
    resolved -> installed [label="更新"];
    resolved -> uninstalled [label="卸载"];
    resolved -> starting [label="启动"];
    starting -> active [label=""];
    active -> stopping [label="停止"];
    stopping -> resolved [label=""];
     
    }


    其他实例

    一棵简单的抽象语法树(AST)

    表达式 (3+4)*5 在编译时期,会形成一棵语法树,一边在计算时,先计算3+4的值,最后与5相乘。

    clip_image026

    对应的脚本如下:

    digraph ast{
    fontname = "Microsoft YaHei";
    fontsize = 10;
     
    node [shape = circle, fontname = "Microsoft YaHei", fontsize = 10];
    edge [fontname = "Microsoft YaHei", fontsize = 10];
    node [shape="plaintext"];
     
    mul [label="mul(*)"];
    add [label="add(+)"];
     
    add -> 3
    add -> 4;
    mul -> add;
    mul -> 5;
    }


    简单的UML类图

    下面是一简单的UML类图,Dog和Cat都是Animal的子类,Dog和Cat同属一个包,且有可能有联系(0..n)。

    clip_image028

    脚本:

    digraph G{
     
    fontname = "Courier New"
    fontsize = 10
     
    node [ fontname = "Courier New", fontsize = 10, shape = "record" ];
    edge [ fontname = "Courier New", fontsize = 10 ];
     
    Animal [ label = "{Animal |+ name : String\l+ age : int\l|+ die() : void\l}" ];
     
        subgraph clusterAnimalImpl{
            bgcolor="yellow"
            Dog [ label = "{Dog||+ bark() : void\l}" ];
            Cat [ label = "{Cat||+ meow() : void\l}" ];
        };
     
    edge [ arrowhead = "empty" ];
     
    Dog->Animal;
    Cat->Animal;
    Dog->Cat [arrowhead="none", label="0..*"];
    }


    状态图

    clip_image030

    脚本:

    digraph finite_state_machine {
     
    rankdir = LR;
    size = "8,5"
     
    node [shape = doublecircle]; 
     
    LR_0 LR_3 LR_4 LR_8;
     
    node [shape = circle];
     
    LR_0 -> LR_2 [ label = "SS(B)" ];
    LR_0 -> LR_1 [ label = "SS(S)" ];
    LR_1 -> LR_3 [ label = "S($end)" ];
    LR_2 -> LR_6 [ label = "SS(b)" ];
    LR_2 -> LR_5 [ label = "SS(a)" ];
    LR_2 -> LR_4 [ label = "S(A)" ];
    LR_5 -> LR_7 [ label = "S(b)" ];
    LR_5 -> LR_5 [ label = "S(a)" ];
    LR_6 -> LR_6 [ label = "S(b)" ];
    LR_6 -> LR_5 [ label = "S(a)" ];
    LR_7 -> LR_8 [ label = "S(b)" ];
    LR_7 -> LR_5 [ label = "S(a)" ];
    LR_8 -> LR_6 [ label = "S(b)" ];
    LR_8 -> LR_5 [ label = "S(a)" ];
     
    }


    附录

    事实上,从dot的语法及上述的示例中,很容易看出,dot脚本很容易被其他语言生成。比如,使用一些简单的数据库查询就可以生成数据库中的ER图的dot脚本。

    如果你追求高效的开发速度,并希望快速的将自己的想法出来,那么graphviz是一个很不错的选择。

    当然,graphviz也有一定的局限,比如绘制时序图(序列图)就很难实现。graphviz的节点出现在画布上的位置事实上是不确定的,依赖于所使用的布局算法,而不是在脚本中出现的位置,这可能使刚开始接触graphviz的开发人员有点不适应。graphviz的强项在于自动布局,当图中的顶点和边的数目变得很多的时候,才能很好的体会这一特性的好处:

    clip_image034

    比如上图,或者较上图更复杂的图,如果采用手工绘制显然是不可能的,只能通过graphviz提供的自动布局引擎来完成。如果仅用于展示模块间的关系,子模块与子模块间通信的方式,模块的逻辑位置等,graphviz完全可以胜任,但是如果图中对象的物理位置必须是准确的,如节点A必须位于左上角,节点B必须与A相邻等特性,使用graphviz则很难做到。毕竟,它的强项是自动布局,事实上,所有的节点对与布局引擎而言,权重在初始时都是相同的,只是在渲染之后,节点的大小,形状等特性才会影响权重。

    本文只是初步介绍了graphviz的简单应用,如图的定义,顶点/边的属性定义,如果运行等,事实上还有很多的属性,如画布的大小,字体的选择,颜色列表等,大家可以通过graphviz的官网来找到更详细的资料。

    本文转载自:
    http://icodeit.org/2012/01/%E4%BD%BF%E7%94%A8graphviz%E7%BB%98%E5%88%B6%E6%B5%81%E7%A8%8B%E5%9B%BE/
    其他几篇介绍graphviz的文章:
    http://www.cnblogs.com/sld666666/archive/2010/06/25/1765510.html
    http://blog.csdn.net/iamljj/article/details/5862930

    展开全文
  • 基于VUE和JSPlumb的在线绘制流程图工具 介绍 VUE FLOW DESIGN流程设计器,基于Vue + Ant Design Vue + JSPlumb,该组件目的是为了使用在Vue项目中,它前身是原生版流程设计器。 Vue版本以全新的技术栈重构了代码,...

    基于VUE和JSPlumb的在线绘制流程图工具

    介绍

    • VUE FLOW DESIGN流程设计器,基于Vue + Ant Design Vue + JSPlumb,该组件目的是为了使用在Vue项目中,它前身是原生版流程设计器
    • Vue版本以全新的技术栈重构了代码,并在原版基础上实现了更好的操作方式,新版会作为优先版本持续迭代。

    效果演示

    • 基础面板
      在这里插入图片描述
    • 拖拽节点到绘图区连线
      在这里插入图片描述
    • 拖拽对齐或使用自动对齐
      在这里插入图片描述
    • 显示/隐藏网格
      在这里插入图片描述
    • 设置节点和连线的属性
      在这里插入图片描述
    • 单节点、多节点移动(按住CTRL键)
      在这里插入图片描述
    • 改变节点对齐的排序顺序(按住Ctrl键一个一个单击选中要对齐的节点,单击的顺序就是对齐的排列顺序)
      在这里插入图片描述
    • 清空画布,重新绘制
      在这里插入图片描述
    • 保存流程图(会生成一段json数据,后台可以保存这段数据,为了便于调试,生成的json数据可以通过快捷键CTRL+ALT+T打开的测试窗口看到。同时也可以从该窗口载入其他的符合流程图的json数据)
      在这里插入图片描述
    • 保存流程图为图片保存到本地
      在这里插入图片描述
    • 通过设置页面(CTRL+ALT+S)可以设置相关参数
      在这里插入图片描述
    • 快捷键说明
      在这里插入图片描述
    • 。。。。。。

    QQ交流群:637230519

    展开全文
  • 根据C语法规则,书写简单流程,自动生成流程图。 用已有c和c++代码生成流程图。 对流程图类的文档进行分类管理。 是个不错的流程图绘制管理工具,具体操作参见里面的说明文件。
  • 而今天我们要介绍的项目,就是基于Python和Graphviz开发的,能将源代码转化为流程图的工具:pycallgraph 1.准备 开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装...

    Graphviz是一个可以对图进行自动布局的绘图工具,由贝尔实验室开源。我们在上次 Python 快速绘制画出漂亮的系统架构图 提到的diagrams,其内部的编排逻辑就用到了这个开源工具包。

    而今天我们要介绍的项目,就是基于Python和Graphviz开发的,能将源代码转化为流程图的工具:pycallgraph

    1.准备

    开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

    Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

    当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南。

    输入以下命令安装 pycallgraph 模块。

    pip install pycallgraph
    

    看到 Successfully installed xxx 则说明安装成功。除此之外,你还需要安装graphviz

    macOS用户请使用brew安装:

    brew install graphviz
    

    windows用户请点击链接:graphviz-2.38.msi 下载安装,安装完成后需要将其写入到环境变量中:

    2.生成流程图

    该模块有两种调用方式,一种是在代码里通过上下文调用:

    from pycallgraph import PyCallGraph
    from pycallgraph.output import GraphvizOutput
    
    with PyCallGraph(output=GraphvizOutput()):
        # 需要绘制流程图的代码,可以是函数
        # ... ...
    

    比如说,绘制一下咱上回的《Python 我的世界》源代码的流程图:

    # ...省略大部分代码...
    if __name__ == '__main__':
        from pycallgraph import PyCallGraph
        from pycallgraph.output import GraphvizOutput
    
        with PyCallGraph(output=GraphvizOutput()):
            main()
    

    在运行该Python文件后,会在当前文件夹下产生一个pycallgraph.png的文件,这个就是该代码的流程图:

    还有一种是使用命令的方式调用,这个方式必须使用bash才能运行,macOS用户可以忽视这个问题,但如果你是windows用户,请通过以下方式打开bash(以VS Code为例):

    然后通过Ctrl + shift + ` 打开一个新的终端,即可看到以bash启动的命令行。

    通过输入以下命令生成流程图:

    pycallgraph graphviz -- ./你需要生成流程图的.py文件
    

    完成后会在当前文件夹下生成一个pycallgraph.png的文件,这个就是这份代码的流程图。

    通过这个方法,你可以清晰地看到这份源代码里面的调用逻辑和其每个模块的运行时间,是一个很方便的小工具,非常适合初学者学习他人的开源模块。大家有需要研究的代码可以用这个工具试一试,说不定有意外的收获呢。

    我们的文章到此就结束啦,如果你喜欢我们今天的Python 实战教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦,有任何问题都可以在下方留言区留言,我们都会耐心解答的!


    Python实用宝典

    不只是一个宝典

    欢迎关注公众号:Python实用宝典

    原文来自Python实用宝典:Python 流程图 — 一键转化代码为流程图

    Python实用宝典

    展开全文
  • 最近项目上需要用流程图来做问题定界分析,之前有同事用jsPlumb做过,但是阅读代码后觉得比较麻烦,所以自己又找了一圈,找到一个叫Dagre-D3的开源类库,画出来的效果如下图,Dagre-D3最大的优点就是可以实现自动...
  • Python 一键转化代码流程图

    千次阅读 2020-05-04 15:27:22
    Graphviz是一个可以对图进行自动布局的绘图工具,由贝尔...而今天我们要介绍的项目,就是基于Python和Graphviz开发的,能将源代码转化为流程图的工具:pycallgraph。 1.准备 开始之前,你要确保Python和pip已经...
  • 自动识别浏览器种类,IE下采用VML绘图,Chrome下采用Canvas绘图,具有设置例子和只读例子,界面上有操作说明,全部源代码。 其中绘图部分的4个js文件为本人编制,有详细注释,非网上下载。
  • 这是大三上学期我们学校...设计一种文件格式来保存流程图,该软件应当可以将绘制好的图形保存为文件,也可以从文件中读取保存的图形。 流程图可以导出为 PNG ,jpg,bmp等6种格式的图像。 可以导出SVG格式的矢量图。
  • 然而,在需要流程模板,或者技术开发阶段以及一些自动化流程的处理过程中,使用代码快速创建流程图也是一种非常有必要的快捷途径。本文重点说明这种方法的实现过程和具体使用价值。 1. 交互式构建流程图 图形交互式...
  • 然而,在需要流程模板,或者技术开发阶段以及一些自动化流程的处理过程中,使用代码快速创建流程图也是一种非常有必要的快捷途径。本文重点说明这种方法的实现过程和具体使用价值。 1. 交互式构建流程图 图形交互...
  • 之前做了一个红警三的建造出兵流程图绘制工具 有评论建议说能不能够自动读取录像。 同时自己使用的时候,也感觉确实一点点手动绘制太过麻烦。 所以专门为该工具做了个自动录像读取分析工具。 总目录 一、简介 二、...
  • 采用可视化界面设计,通过绘制流程图,结合拖拽式控件,快速便捷实现流程自动化,适用于代码生成、环境搭建、应用发布、模拟操作、循环检测、数据处理等场景。将重复可替代的繁杂工作,轻松低投入实现自动化。 目前...
  • 总目录 一、简介 ...1 - 为流程图绘制工具拓展 这个拓展起来还是比较简单的。 主要是添加图片素材就可以, 在images/nodes文件夹下,根据单位种类找到其所属于的文件夹添加单位图片,文件夹和命名格式可见 ...
  • autoflowchart.rar

    2011-08-31 10:17:27
    可以根据代码自动绘制流程图,准确度高,使用方便!
  • yED Grahp Editor是一个小巧的Java绘图工具,绘制方便,还可以...可以根据绘制的UML生成JAVA代码,可以直接导出为Gif、PNG、Jpeg、Pdf、Html图像地图文件等。相对来说,如果只是绘图的话,我们推荐您使用yED。 ...
  • 流程引擎驱动事务办理,将线下的会签事项搬到线上,绘制相对应的流程图; 自定义权限控制,权限细化到按钮,操作拦截到具体的接口,保持公共数据的可阅读性与安全性; 数据存储/中间件 名称 存储类型 作用 MySQL ...
  • 绘制流程图的控件,可以根据程序生成流程图 4. FlowchartExpert. Delphi专家,根据当前程序生成流程图======================================================联系方法: 网址: ...
  • 图像集批处理分析(BASIS)是Matlab框架,用于自动化,存档和运行图像分析,图像处理和机器视觉工作流程。 BASIS是一个完全面向对象的,功能齐全的数据流框架。 简而言之,它使您可以运行存储为.gml文件的DAG。 图形...
  • 自动绘制轨迹是通过读取数据实现参数变化来并绘制图形的,大致流程如下:写程序 -----读取数据 -----绘制轨迹。 因此,根据.py脚本来绘制图形,不是写代码来直接绘制turtle轨迹,而是由读取的数据来绘制轨迹。 二、...
  • 构建学生请假审批流程

    千次阅读 2017-06-17 13:58:02
    绘制流程图:start->学生请假申请->班长审批->班主任审批->end,对这个流程图文件命名为:StudentLeaveProcess.bpmn,保存后自动生成同名的png文件。中间这三个节点的处理人分别为张三,李四,王五。 2.编写相关的...
  • javaSE代码实例

    2016-06-21 22:30:18
    1.4.1 开发源代码 8 1.4.2 编译运行 9 1.5 小结 11 第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档注释 13 2.2 基本数据类型...
  • Quartz绘图使用示例

    千次阅读 2014-12-18 20:44:08
    概要  本章主要简示了使用IOS的绘图Quartz,包括简单的画直线、图片、文字、圆、矩形、...2.新建一个基于UIView的类,发现新建类里面自动生成了drawRect方法,直接在这个方法里面写代码即可自动被调用 3.注意绘图
  • 1.2.3 OpenGL图形处理流程 1.2.4 OpenGL图形绘制方式 1.2.5 OpenGL程序的运行方式 1.3 OpenGL图形开发库 1.3.1 开发库的组成 1.3.2 基本数据类型 1.3.3 OpenGL库函数命名规则 1.4 基于OpenGL的高层...
  • 疯狂ios讲义源代码

    千次下载 热门讨论 2014-01-02 09:12:50
    第3章 流程控制与数组 47 3.1 顺序结构 48 3.2 分支结构 48 3.2.1 if条件语句 48 3.2.2 switch分支语句 52 3.3 循环结构 54 3.3.1 while循环语句 54 3.3.2 do while循环语句 56 3.3.3 for循环 56 3.3.4 ...
  • 和radarserver,并以优化的方式绘制总地图(减少区域和更多可见箭头)并保存RadStruct.mat 文件的增量副本。 1.1.5 版本从外部文本文件读取输入参数,即文件夹路径、地图表示和总地图评估的纬度

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 240
精华内容 96
关键字:

代码自动绘制流程图