Python - pack仅在方法完成后生效

时间:2017-05-09 19:17:33

标签: python tkinter

我正在制作一个小游戏,你输入一些金额n,你会得到n个颜色随机颜色的帧。 3秒后,提示用户尝试调用彩色帧的顺序。

请注意,倒计时后的事件尚未实施(应该没有问题)。

我有一个隐藏输入字段和确认按钮,显示颜色并进行倒计时的方法:

def startgame(colornumber): #colornumber is the amount of frames
    ...
    colors=[] #array of "Frame" elements
    #loop that creates the colored frames
    for i in range (0, colornumber):
        colors.append(Frame(window, width=60, height=60, background=randomcolor()))
        colors[i].pack(side=LEFT)

    #randomcolor() is a method that returns a random color string
    #like "white" or "red"

    #countdown loop
    for i in range(0, 3):
        time.sleep(1)   #do nothing for 1 second
        label.configure(text="ASD")    #Count down
        print(str(3-i))
    label.configure(text="What was the order? Click on the colors to choose")

按钮调用函数如下:

colorNumberInput = Entry(window)
colorNumberInput.pack()
buttonConfirmNumber = Button(window, ..., command=lambda: startgame(int(colornumberInput.get()))
buttonConfirmNumber.pack()

由于某种原因,语句color[i].pack(side=LEFT)的效果仅在方法执行完毕后发生;也就是说,在倒计时循环结束后。结果是颜色在倒计时之后出现,而不是在倒数之前出现。我尝试将print语句放入创建彩色帧的循环中,并且无论如何都会执行。

为什么pack(element)仅在调用它的方法结束后显示小部件?有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

Tkinter只能通过响应事件来刷新显示。在代码运行或程序正在休眠时,它无法响应事件。

快速解决方法是在您希望屏幕刷新时调用window.update_idletasks()。这通常不是最佳解决方案,但通常是足够好的。