<p>你做了一个非常好的第一次尝试,你几乎到了那里。我在您的代码中做了一些更改,最重要的是引入了一个<code>root</code>对象(<code>tk.Tk()</code>),所以我可以这样做根目录更新()以便在新方法<code>blip_canvas</code>中重新绘制到<code>sort_canvas</code>。为了避免一些“闪烁”而不是每次都破坏画布,最好只删除“bar”元素。
此外,我还随意更改了一些变量名,使其更具python风格(应该使用下划线而不是大写),并添加了<code>if _name__ == '__main__'</code>语句。你知道吗</p>
<p>请看下面的代码。你知道吗</p>
<pre><code>import tkinter as tk
from tkinter import ttk
import random
class SortingVisualizer:
def __init__(self):
self.root = tk.Tk()
self.root.wm_title("Sorting Visualizer")
self.root.wm_minsize(width=600, height=500)
self.root.wm_resizable(width=False, height=False)
self.top_frame = tk.Frame(self.root)
self.top_frame.grid(row=0, sticky='w')
self.sort_options = ['Select Algorithm', 'Bubble sort', 'Quicksort', 'Merge sort']
self.option_var = tk.StringVar()
self.option_drop = ttk.OptionMenu(
self.top_frame, self.option_var, *self.sort_options)
self.option_drop.config(width=15)
self.option_drop.grid(row=0, column=1, sticky='ew')
self.sort_button = ttk.Button(
self.top_frame, text="Sort", command=self.bubble_sort)
self.sort_button.grid(row=0, column=2, sticky='w')
self.gen_button = ttk.Button(
self.top_frame, text="Generate New Array", command=self.new_array)
self.gen_button.grid(row=0, column=0)
self.sort_canvas = tk.Canvas(self.root)
self.bars = []
def new_array(self):
self.generate_array()
self.blip_canvas()
def generate_array(self):
self.array = []
self.num_operations = 0
i = 0
while i < 15:
height = random.randint(15, 200)
self.array.append(height)
i = i + 1
def draw_canvas(self):
label = "Number of Operations: " + str(self.num_operations)
self.num_label = tk.Label(self.top_frame, text=label)
self.num_label.grid(row=1)
self.sort_canvas = tk.Canvas(self.root, width=600, height=450)
self.sort_canvas.grid(row=1)
self.sort_canvas.create_line(15, 15, 585, 15)
bar_width = 20
bar_gap = bar_width + 10
start_x = 30
start_y = 15
self.bars = []
for bar_height in self.array:
x1 = start_x + bar_width
y1 = start_y + bar_height
self.bars.append(self.sort_canvas.create_rectangle(
start_x, start_y, x1, y1*2, fill='green'))
start_x = start_x + bar_gap
def blip_canvas(self):
self.sort_canvas.delete(self.bars)
self.draw_canvas()
self.root.update()
self.root.after(200)
def bubble_sort(self):
n = len(self.array)
for i in range(n):
for j in range(n-i-1):
if self.array[j] > self.array[j+1]:
self.array[j], self.array[j+1] = self.array[j+1], self.array[j]
self.num_operations += 1
self.blip_canvas()
def start(self):
tk.mainloop()
if __name__ == '__main__':
app = SortingVisualizer()
app.start()
</code></pre>
<p><em>注意在bubble\u排序中,不需要temp变量来交换array[j]和array[j+1]的值</em></p>
<p>而不是使用<code>time.sleep(0.2)</code>来设置我使用的延迟:</p>
<pre><code>self.root.update()
self.root.after(200)
</code></pre>
<p>如<a href="https://stackoverflow.com/questions/45001341/python-tkinter-update-button-text-after-delay">Update button after delay</a>所示</p>
<p>您也可以坚持原来的代码,只做一些更改。<br/>
1) 更改排序按钮</p>
<pre><code>self.sortButton = ttk.Button(self.topFrame, text = "Sort", command=self.bubbleSort)
</code></pre>
<p>2)缩进要与SortingVisualizer对齐的bubbleSort方法</p>
<p>3)将方法redrawCanvas更改为:</p>
<pre><code> def redrawCanvas(self):
self.sortCanvas.destroy()
self.drawCanvas()
self.update()
self.after(300)
</code></pre>
<p>以及</p>
<p>4)在bubbleSort中调用<code>redrawCanvas</code>:</p>
<pre><code> 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.redrawCanvas()
</code></pre>
<p>瞧,会有用的!你知道吗</p>