перемещение прямоугольников, замерзающих до конечного состояния, вместо выполнения каждого движения

#python #sorting

Вопрос:

Я пытаюсь написать программу, которая может показать, как алгоритмы сортировки сортируют список. Мой алгоритм работает нормально, и программа может визуализировать начальное состояние и отсортированное состояние, но, похоже, она не показывает каждую итерацию, хотя я пытаюсь вызвать функцию в коде сортировки.

Интересно, что без вызова этих функций программа мгновенно покажет отсортированный список, но с ними это происходит очень медленно. Это на самом деле хорошо, потому что я хочу, чтобы он визуализировал процесс, который займет больше времени, чем сортировка за долю секунды, как это обычно было бы. Однако за те несколько секунд, которые требуются для обработки, бары вообще не двигаются. Он просто зависает, а затем показывает отсортированный список вместо того, чтобы показывать движущиеся бары (я не хочу, чтобы они анимировались или что-то еще, я просто хочу видеть, как бары обновляются на каждом шаге сортировки).

Я пытался использовать time.sleep() , чтобы заставить программу ждать нового местоположения, прежде чем двигаться дальше, но это привело к сбою программы. По — видимому, это связано с библиотекой tkinter.

 import tkinter as tk
import random

W = 1000
H = 800
buffer = 20
nums = []
numElements = 100
window = tk.Tk()
winSize = "{0}x{1}".format(str(W),str(H))
rectangles = []
w = tk.Canvas(window, width=W, height=H)

# Quick Sort algorithm to sort the list by count of word
def quickSort():
    list = nums
    def sorter(items, low, high):
        drawArr()
        if low < high:
            split = partition(items, low, high)
            sorter(items, low, split)
            sorter(items, split   1, high)

    sorter(list, 0, len(list)-1)

    

# Partition method used for Quick Sort to get pivot point
def partition(list,start,end):
    low = start - 1
    high = end   1

    pivot = list[(low   high) // 2]
    
    while True:
        low = low   1
        while list[low] < pivot:
            low = low   1

        high = high - 1
        while list[high] > pivot:
            high = high - 1

        if low >= high:
            return high

        list[low], list[high] = list[high], list[low]

        clearCanv()


def createArr():
    for x in range(numElements):
        nums.append(random.randrange(1, 100))
def clearCanv():
    for x in rectangles:
        w.delete(x)
    w.pack()
def drawArr():
    tempW = W - buffer
    posX = buffer
    for x in nums:
        try:
            rect = w.create_rectangle(posX, 500, posX 10, 50 nums[x]*2 250,fill='red')
            rectangles.append(rect)
            posX = posX   (W - buffer - buffer)/len(nums)
            w.pack()
        except:
            continue
        
createArr()
drawArr()

window.geometry(winSize)

greeting = tk.Label(text="Welcome to the Algorithmic Sorting Animator!")
greeting.pack(side = tk.TOP)


# Create a Button
btn = tk.Button(window, text = 'Quick Sort', command = quickSort)
btn.pack()

window.mainloop()
 

Ответ №1:

Я нашел ответ на этот вопрос! вам нужно использовать встроенный update() метод всякий раз, когда вы хотите, чтобы окно обновлялось. В моем случае это window.update() так, но для тебя это может быть root.update()