Приостановка программы Python с графическим интерфейсом - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь создать простой визуализатор сортировки в Python, используя Tkinter.Учитывая это, я хотел бы, чтобы пользователь мог видеть изменения, которые происходят в каждой итерации алгоритма сортировки (какой бы алгоритм ни использовался), и для этого я должен «приостановить» программу для пользователя.чтобы увидеть изменения каждый тик.

Это "пауза" часть, которая смущает меня.Я посмотрел на time.sleep, который не имеет отношения к программам с графическим интерфейсом (из-за mainloop) и after() в библиотеке Tkinter, но я не могу понять, что это правильно.

Мой код:

arr = [random.randint(0,600) for i in range(100)]


WIN_WIDTH = 1200
WIN_HEIGHT = 800


BAR_NUM = len(arr)
BAR_WIDTH = WIN_WIDTH // BAR_NUM

class sortVisualizer(tk.Frame):

    def __init__(self, master=None):
        super().__init__(master)
        canvas = tk.Canvas(root,width=WIN_WIDTH,height=WIN_HEIGHT)

        self.draw(canvas)
        canvas.pack()

        queue = [self.bubbleSort(canvas)] //theres going to be more than just one sorting algorithm
        queue[0]

    def re_draw(self,canvas,index1,index2):

        canvas.delete("all")

        temp = arr[index1]
        arr[index1] = arr[index2]
        arr[index2] = temp

        for i in range(BAR_NUM):
            canvas.create_rectangle(BAR_WIDTH * i,
                                    WIN_HEIGHT - arr[i],
                                    BAR_WIDTH * (i+1),
                                    WIN_HEIGHT,
                                    fill = "white")

        canvas.pack()

    def bubbleSort(self,canvas):
        for item in range(len(arr)-1,0,-1):
            for i in range(item):
                if (arr[i] > arr[i+1]):
                    self.re_draw(canvas,i,i+1)

В классе sortVisualizer есть еще несколько функций, но они не имеют значения.

Итак, мой вопрос: как я смогу "приостановить" или "остановить" программу, чтобы пользователь мог видеть изменения в каждом тике?

1 Ответ

0 голосов
/ 07 сентября 2018

После комментария @Mike - SMT я использовал root.update() в конце функции bubbleSort следующим образом:

def bubbleSort(self,canvas):
    for item in range(len(arr)-1,0,-1):
        for i in range(item):
            if (arr[i] > arr[i+1]):
                self.re_draw(canvas,i,i+1)
                root.update()

Это не только "приостановило" или "остановило" или показало прогресс программы, но также открыло окно программы и позволило обновлять графику из основного цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...