我正在使用Tkinter库用Python制作一个排序算法可视化工具。heapsort出现了一个问题。除此之外,我已经很容易地介绍了大多数其他算法
我可以很容易地进行第一次heapification,但随后出现了以下错误:-
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.496.0_x64__qbz5n2kfra8p0\lib\tkinter\__init__.py", line 1884, in __call__
return self.func(*args)
File "C:\Users\sriva\Desktop\My Folder\Projects\Sorting-Algorithm-Visualizer\sortingAlgo.py", line 63, in startAlgorithm
heap_sort(data, drawData, speedScale.get())
File "C:\Users\sriva\Desktop\My Folder\Projects\Sorting-Algorithm-Visualizer\heapsort.py", line 27, in heap_sort
heapify(data, i, 0, drawData, timetick)
File "C:\Users\sriva\Desktop\My Folder\Projects\Sorting-Algorithm-Visualizer\heapsort.py", line 4, in heapify
drawData(data, ['yellow' if x==i else 'red' for x in range(n)])
File "C:\Users\sriva\Desktop\My Folder\Projects\Sorting-Algorithm-Visualizer\sortingAlgo.py", line 34, in drawData
canvas.create_rectangle(x0,y0,x1,y1,fill=colorArray[i])
IndexError: list index out of range
以下是我的堆排序代码:-
import time
def heapify(data, n, i, drawData, timetick):
drawData(data, ['yellow' if x==i else 'red' for x in range(n)])
time.sleep(timetick)
largest = i
left = 2*i+1
right = 2*i+2
if left < n and data[i] < data[left]:
largest = left
if right < n and data[largest] < data[right]:
largest = right
if largest != i:
data[i], data[largest] = data[largest], data[i]
heapify(data, n, largest, drawData, timetick)
def heap_sort(data, drawData, timetick):
n = len(data)
for i in range(n//2, -1, -1):
heapify(data, n, i, drawData, timetick)
for i in range(n-1, 0, -1):
data[i], data[0] = data[0], data[i]
heapify(data, i, 0, drawData, timetick)
drawData(data, ['green' if x > i else 'yellow' if x==i else 'red' for x in range(n)])
time.sleep(timetick)
以下是drawData函数的代码:-
from tkinter import *
from tkinter import ttk
import random
from heapsort import heap_sort
root = Tk()
root.title('Sorting ALgorithm Visualization')
root.maxsize(1100, 700)
root.config(bg="black")
#variables
selected_algo = StringVar()
data = []
def drawData(data, colorArray):
canvas.delete("all")
c_width=750
c_height=700
x_width=c_width/(len(data)+1)
offset = 30
spacing = 0
normalizedData = [i/max(data) for i in data]
for i, height in enumerate(normalizedData):
x0 = i * x_width + offset + spacing
y0 = c_height - height * 660
x1 = (i+1)*x_width+offset
y1 = c_height
canvas.create_rectangle(x0,y0,x1,y1,fill=colorArray[i])
canvas.create_text(x0+2, y0, anchor=SW, text=str(data[i]))
root.update_idletasks()
def Generate():
global data
minVal = int(minEntry.get())
maxVal = int(maxEntry.get())
size = int(sizeEntry.get())
data = []
for _ in range(size):
data.append(random.randrange(minVal, maxVal+1))
drawData(data, ['red' for x in range(len(data))])
def startAlgorithm():
global data
if not data: return
if algMenu.get() == 'Heap Sort':
heap_sort(data, drawData, speedScale.get())
drawData(data, ['green' for x in range(len(data))])
#frame
ui_frame = Frame(root, width=250, height=700, bg='grey')
ui_frame.grid(row=0, column=0)
ui_frame.grid_propagate(0)
canvas = Canvas(root, width=800, height=700, bg='white')
canvas.grid(row=0, column=1)
Label(ui_frame, text="Algorithm", bg='grey').grid(row=0, column=0, padx=5, pady=(50,10))
algMenu = ttk.Combobox(ui_frame, textvariable=selected_algo, width=15, values=['Heap Sort'])
algMenu.grid(row=0, column=1, padx=5, pady=(50, 10))
algMenu.current(0)
目前没有回答
相关问题 更多 >
编程相关推荐