Dijkstra迪杰斯特拉加权有向图最短路径动态演示(Python GUI tkinter)—山东大学数据结构课程设计

说明:blog 不全面而且也不是上交实验报告的最终版本(是自己实验过程中简单记录的笔记),完整内容(含代码+实验报告)可以通过(Dijkstra迪杰斯特拉加权有向图最短路径动态演示(Python GUI tkinter)—山东大学数据结构课程设计)下载,或者微信公众号关注“陌兮blog”免费获取
在这里插入图片描述

一、程序演示效果

1、程序界面:

在这里插入图片描述

2、程序使用:

首先选择自定义or随机生成,这个是演示地图的生成方式,如果自定义,则需选择存储方式,邻接矩阵or邻接链表or邻接数组,然后输入节点数、边数、起始节点、终止节点,输入完成后点击提交。然后选择文件路径,点击选择文件,则会弹出文件选择对话框,并且默认只能选择txt文件。选择完成后,会在文件路径一栏显示文件的路径,并且会显示出根据此文件创建的地图,按照上面的存储方式选项打印出创建的存储信息。
在这里插入图片描述
创建好的地图
在这里插入图片描述

然后选择演示速度,滑动滑块选择,结果在右面输入框显示。
最后点击确定按钮,动态演示路径寻找过程,最终结果在以图片形式输出的同时,最短路径长度和最短路径为输入框中也会显示。输出时graph的标号代表顺序。

3、动态展示:

部分演示过程图片:
在这里插入图片描述

在这里插入图片描述

红色代表已经到达的节点和走过的边
最终结果会在最短路径长度和最短路径一栏显示,同时图中也会标红
在这里插入图片描述

二、设计过程及思路:

选好这个课设题目以后,最开始用的c++写的,只有控制台应用,就是那种黑窗口,功能和这个图形化的一样,很快写好了之后,发现图形化界面可能更好些,尝试c++的图形化界面,准备用qt写,自学了两天qt,学了个基础,但是自己写起来好麻烦,报错不懂得地方又多。于是转而使用Python的tkinter模块,比较简单,容易上手,看了一篇博客,写的非常不错,很适合初学者入门

博客链接: http://www.cnblogs.com/shwee/p/9427975.html

选好语言之后,开始实现各个功能。首先自定义还是随机生成,这种多个选项然后只能选一个的按钮可以用tkinter中的radiobutton来实现,具体用法刚才分享的博客里面有写。
r1 = tk.Radiobutton(window, text='邻接矩阵', variable=var, value='jz', command=print_selection1).place(x=75,y=40)
这个代码就创建了邻接矩阵的那个按钮

随机生成:

random模块里面的randint(x,y)函数可以随机生成一个x到y的整数,先随机生成一个节点个数n,然后创建邻接矩阵,再用同样的函数初始化邻接矩阵。然后从用户输入框读入起始节点和终止节点。执行dijkstra函数,输出最短路径。

自定义:

自定义需要文件输入,文件格式为1,2,3类型,代表从节点1到节点2之间的权值为3。关于文件选择对话框的弹出,只要把文件选择按钮所触发的函数指定为打开文件选择对话框即可

file_path = filedialog.askopenfilename(title='选择文件',initialdir = 'D:/',filetypes=[("Text file", "*.txt*")])

打开文件对话框,默认路径为D盘,格式为txt文件,返回值为文件路径。
然后就是文件读入

with open(file_path,"r") as f:#r表示只读方式打开,文件的指针会放在文件的开头
        for line1 in f:
            l=line1.strip().split(",")#strip()表示删除掉数据中的换行符,split(',')表示数据中遇到‘,’就隔开
            if(l.__len__() != 3):
                tkinter.messagebox.showerror(title=("错误信息"),message=("您上传的文件格式有误!"))
                return

可以利用 l 加上索引值获得节点及权值,初始化存储内容。

存储方式

存储方式就是基本数据结构知识,转化为Python实现即可

输入框、演示速度滑块、输出框等

演示速度可以用sleep函数实现,使得代码在某个位置停留一定时间。关于这几个组件,均为基本tkinter的使用,上面博客中写的比较详细

三、部分代码:

见相关资源

四、遇到的一些小问题

遇到的问题基本搜一下就可以找到解决办法,部分基本记录在这篇博客

https://blog.csdn.net/m0_47470899/article/details/114002070

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌兮_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值