回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我一直想用python制作一个排序算法可视化工具,并决定使用Tkinter库作为我可视化数据的方式(如果有人有更好的库可以使用,我愿意接受建议,我查看了matplotlib,但不太愿意)。我的问题是,在对数组排序时,我想进行交换,在交换之后显示更新的数组,然后继续排序;但最终的结果是数组排序,然后更新整个排序的数组。你知道吗</p>
<pre><code>import tkinter as tk
from tkinter import ttk
import random
import time
class SortingVisualizer(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.wm_title(self, "Sorting Visualizer")
tk.Tk.wm_minsize(self, width=600, height=500)
tk.Tk.wm_resizable(self, width=False, height=False)
self.topFrame = tk.Frame(self)
self.topFrame.grid(row=0, sticky='w')
self.sortOptions = ['Select Algorithm','Bubble sort','Quicksort', 'Merge sort']
self.optionVar = tk.StringVar()
self.optionDrop = ttk.OptionMenu(self.topFrame, self.optionVar, *self.sortOptions)
self.optionDrop.config(width=15)
self.optionDrop.grid(row=0, column=1, sticky='ew')
self.sortButton = ttk.Button(self.topFrame, text = "Sort", command = lambda: bubbleSort(self))
self.sortButton.grid(row=0, column=2, sticky='w')
self.genButton = ttk.Button(self.topFrame, text = "Generate New Array", command = self.newArray)
self.genButton.grid(row=0, column=0)
self.generateArray()
def newArray(self):
self.sortCanvas.destroy()
self.generateArray()
def generateArray(self):
self.array = []
self.numOperations = 0
i = 0
while i < 15:
height = random.randint(15, 200)
self.array.append(height)
i = i + 1
self.drawCanvas()
def drawCanvas(self):
self.sortCanvas = tk.Canvas(self, width=600, height=450)
self.sortCanvas.grid(row=1)
self.sortCanvas.create_line(15, 15, 585, 15)
label = "Number of Operations: " + str(self.numOperations)
self.numLabel = tk.Label(self.topFrame, text = label)
self.numLabel.grid(row=1)
bar_width = 20
bar_gap = bar_width + 10
start_x = 30
start_y = 15
for bar_height in self.array:
x1 = start_x + bar_width
y1 = start_y + bar_height
self.sortCanvas.create_rectangle(start_x, start_y, x1, y1*2, fill='green')
start_x = start_x + bar_gap
def redrawCanvas(self):
self.sortCanvas.destroy()
self.drawCanvas()
def bubbleSort(self):
n = len(self.array)
for i in range(n):
for j in range(0, n-i-1):
if self.array[j]>self.array[j+1]:
temp = self.array[j]
self.array[j] = self.array[j+1]
self.array[j+1] = temp
self.numOperations += 1
self.after(300, self.redrawCanvas)
app = SortingVisualizer()
app.mainloop()
</code></pre>
<p>我也试过了应用程序后(300, 自重绘画布)得到同样的结果</p>