暂停GUI Python程序

时间:2018-09-07 16:58:57

标签: python python-3.x tkinter

我正在尝试使用Tkinter在python中创建一个简单的排序可视化程序。话虽如此,我希望用户能够看到排序算法的每次迭代(无论使用哪种算法)中发生的更改,并且为此,我必须为用户“暂停”程序查看每个刻度的变化。

让我感到困惑的是“暂停”部分。我研究了time.sleep与Tkinter库中的GUI程序无关(由于主循环)和after(),但我似乎无法正确理解。

我的代码:

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 :(得分:1)

在@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()

这不仅“暂停”或“停止”或显示程序的进度,而且还调出了程序的窗口并允许从主循环内更新图形。

相关问题