说明: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