Skip to content
AD
AD

事件循环与事件

什么是事件循环

对于 GUI 应用程序,事件循环是其重要组成部分。

众所周知,Python 代码是按行解释执行的,这一过程是在单线程中执行的。如果一切正常的话,Python 脚本按行执行下去,几十行代码很快就会结束,程序将会退出。

然而,我们刚刚观察到,只有在我们手动关闭 Tkinter Hello 窗口之后,Python 解释器才终于退出。这是因为在代码中,我们使用 root.mainloop() 进入了 Tkinter 的事件循环。

在事件循环中,Tkinter 暂时性地「阻塞」了我们编写的 Python 代码,开始维护我们编写的 GUI 给用户使用,处理用户的输入并进行相应的响应,并且时刻向操作系统汇报我们的程序仍然存活。只有在用户关闭了我们的 Tkinter Hello 窗口之后,代码才得以从 root.mainloop() 继续执行下去,也即程序才退出。

调用的方法 mainloop() 正是「主循环」之意义。

Tkinter 事件循环

运行 mainloop() 时,Python 解释器的主线程会维护一个事件循环。你可以把它理解为一个更加优雅的 while True 循环。

每一次循环,Python 都会处理 GUI 更新,比如:

  • 用户的鼠标移动到了哪个控件上:绘制控件的悬停状态(按钮);
  • 用户的鼠标点击了哪个控件:绘制控件的按下状态(按钮)、执行控件绑定的点击命令(按钮的 command);
  • 用户在键盘上输入了哪个按键:接收键盘输入事件,判断是否有与输入的按键绑定的命令需要执行;
  • 用户的鼠标拖动了窗口:在拖动时持续重新绘制窗口,让窗口跟随用户的鼠标移动……
  • 用户点击了窗口的最小化、最大化、关闭按钮:将窗口最小化、最大化、关闭。

这是在一个线程中执行的,我们称之为 Tkinter 主线程。

显然,如果主线程阻塞(执行耗时长的任务时),意味着事件循环阻塞,意味着我们的 GUI 无法得到更新。此时,操作系统会判断我们的程序「无响应」,并在持续一定时间之后建议用户结束进程。因为对操作系统来说,它无从得知未响应的程序到底是什么情况,是在执行任务还是单纯卡死惹。

了解了事件循环之后,接下来我们就可以让我们的 Tkinter 程序具备执行任务的能力了。

贡献者

页面历史

贡献/支持 Code Space

请查看贡献页面,帮助 Code Space 完善内容以提供更好的文档服务。
或者,也可以浅浅支持芒果一下~