很简单。你把鼠标一个按上会变成手型。或者你在知乎回答问题的文本框里输入文字。甚至你看到的电脑屏幕内容。看上去是动态的。其实和动画电影原理差不多。

现在你鼠标的移动,键盘的按键。都是实实在在输入。这里我们叫做事件。譬如有鼠标移动事件,单击事件,F5按下的事件。

以回答问题 按钮<发布回答>左侧的匿名勾选框为例。你单击一次,就绿色小勾表示选中。再单击就去掉了小勾。现在你这样想。实际上有两幅图(有勾和无勾的)。你单击鼠标移动鼠标就触发了事件,会把你鼠标的坐标和单击这个行为捕获。那假设你单击了,鼠标坐标又在那个框框区域内,我们就把一张图用另外一张图代替,同时后台表示是否匿名的某个变量取反。

root到root.pack()之间,无非就是设计你的部件的类型,尺寸,样式,位置,然后绑定一个事件。

mainloop就进入到事件(消息)循环。一旦检测到事件,就刷新组件。譬如你输入一个字符,就要立即在光标那个位置显示出来(前提是你选中了文本框,也就是鼠标在文本框这个图案的范围内单击过)。又譬如你点了首页这个按钮(就是在这个图形的区域附近单击)那么就要清除你浏览器里的全部部件,然后重新绘制(按照主页设计的布局和内容)。

再给你打个比方。你设计的程序中间有个按钮,你设计的时候就要把一个按钮放到中间去。这个按钮有一个属性(假设和变量x关联,x表示按钮上文字的颜色,如果是1就黑色,0就灰色)。你按一下按钮,文字颜色就会切换。root到root.pack()你就相当于在那里放按钮(其实按钮就是多幅图,某一时刻显示其中一张),具体颜色看x取值。现在到了mainloop。一旦有事件,就又在那里放按钮(不妨直接覆盖原来的图)。所以在那个位置单击鼠标才是触发某个你想要的程序行为的要素,那个按钮的刷新,不过是其中一项程序行为。有没有按钮你都可以点击那个区域触发。但是除了设计者,谁知道呢?无法是视觉效果罢了。



PS:如果你知道连环画,你可以理解为,每个部件都是连环画。root到root.pack()就是你设计连环画。mainloop就是去翻它!实际上不是有很多程序有一个选项就是 动画效果么,关闭可以减少资源消耗。无非就是连环画的页数多。快速翻阅就有动感。如果只有两页,看上去很唐突而已。

pps:前面也说了,你看到电脑屏幕也是如此,是不停在刷新的。一般是50-60hz每秒。游戏里不有一个fps么,桢率 就是画面的刷新频率,太慢不就会卡顿么(和网络卡不是一回事)。然后屏幕还有局部刷新的技术,不一定每次都刷新整块屏幕。设计的程序也是。你可以所有组件每次事件都重新画。也可以只是画你需要的部分。