Итерация шагов быстрой сортировки - визуализация в черепахе - PullRequest
0 голосов
/ 06 июня 2019

Я пишу простое приложение на 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

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Я бы посоветовал вам сконцентрировать логику «ожидания клика» в одном месте, а не смешивать ее с остальной логикой сортировки.

Например

def waitForClick():
    global clickedFlag
    clickedFlag = False
    while clickedFlag == False:
         onscreenclick(clicked)
         listen()

...
    if array[i] < pivotValue: 
        waitForClick()
        swap(array, i, pivotIndex)                  
        pivotIndex += 1                            
...
0 голосов
/ 07 июня 2019

У вас есть базовое недопонимание событий мыши в графике черепахи. Они прибывают как независимые события, и вы не можете просто остановить свой работающий код, чтобы дождаться его появления. Ваш код должен быть разработан для реагирования на события.

Я полагаю, что более простой пакет 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()

enter image description here

...