我正在Python3
中用Turtle
编写一个简单的应用程序。它可视化quicksort
算法。我想改进我的应用程序,以便等待用户的点击来显示算法的每个步骤。
我在算法中间尝试了简单的input()
,但这要求控制台在应用程序窗口转到后台时处于活动状态。
现在,我尝试使用onscreenclick()
,但是当算法达到特定点时,它将停止侦听鼠标事件。
我该怎么办?还有其他方法吗?
def partition(array, start, end):
global clickedFlag
pivotIndex = start
pivotValue = array[end]
for i in range(start, len(array) - 1):
if array[i] < pivotValue:
if clickedFlag:
swap(array, i, pivotIndex)
pivotIndex += 1
clickedFlag = False
else:
while clickedFlag == False:
onscreenclick(clicked)
listen()
swap(array, pivotIndex, end)
return pivotIndex
def clicked(x,y):
global clickedFlag
clickedFlag = True
return clickedFlag
答案 0 :(得分:1)
我建议您将“等待点击”逻辑集中在一个地方,不要将其与其余排序逻辑混在一起。
例如
def waitForClick():
global clickedFlag
clickedFlag = False
while clickedFlag == False:
onscreenclick(clicked)
listen()
...
if array[i] < pivotValue:
waitForClick()
swap(array, i, pivotIndex)
pivotIndex += 1
...
答案 1 :(得分:0)
您对乌龟图形中的鼠标事件有基本的误解。它们作为独立事件到达,您不能简单地停止正在运行的代码以等待事件发生。您的代码必须设计为响应事件。
我相信更简单的Zelle Graphics软件包可能更适合您的需求。 getMouse()
例程将停止您的程序,并等待用户单击鼠标。
下面,我对您(已完成的)代码实施了粗略的可视化处理,将经过改组的数组打印到控制台。在图形窗口中,从底部开始,中心处的枢轴索引处的值以红色显示,而其余的数组值则在两侧显示。在窗口中单击时,程序将前进,并且图形窗口也将更新,直到在控制台窗口中打印出已排序的数组。再次单击退出程序:
from random import shuffle
from graphics import *
def swap(array, i, j):
array[i], array[j] = array[j], array[i]
def partition(array, start, end):
global text
pivotIndex = start
pivotValue = array[end]
for i in range(start, len(array) - 1):
if array[i] < pivotValue:
##########################################
# crude visualization example
text = [obj.clone() for obj in text]
left, pivot, right = text
left.setText(str(array[:pivotIndex]))
pivot.setText(str(array[pivotIndex]))
right.setText(str(array[pivotIndex + 1:]))
for obj in text:
obj.draw(window).move(0, -10)
window.getMouse() #
##########################################
swap(array, i, pivotIndex)
pivotIndex += 1
swap(array, pivotIndex, end)
return pivotIndex
def quickSort(array, low, high):
if low < high:
pivotIndex = partition(array, low, high)
quickSort(array, low, pivotIndex - 1)
quickSort(array, pivotIndex + 1, high)
########################################################################################
# crude visualization setup
window = GraphWin("Sorting Visualization", 800, 600)
text = [Text(Point(200, 600), ""), Text(Point(400, 600), ""), Text(Point(600, 600), "")]
text[1].setTextColor('red') #
########################################################################################
array = list(range(20))
shuffle(array)
print(array)
quickSort(array, 0, len(array) - 1)
print(array)
window.getMouse()
window.close()