在用 python 创建项目时,我想创建一个 GUI,所以我决定使用模块 tkinter。在我的代码中尝试实现 while True 循环后,GUI 似乎已冻结且无法使用,所以我想问一下这是 GUI 模块本身的问题,还是 Python 本身的问题?其他语言也一样吗?
这是大多数 GUI 框架的本质。要使 GUI 正常工作,它必须能够接收稳定的事件流以进行处理。这些事件可以是按钮点击、键盘输入和系统生成的事件,操作系统告诉窗口它需要刷新。
处理这些事件的代码通常称为事件循环——它是一个全局循环,等待事件,将它们与注册的处理程序进行比较,然后调用处理程序。在 tkinter 中,调用 mainloop
函数会启动此事件循环。
当您在 GUI 运行的同一线程中放置一个长循环或无限循环时,当该代码正在运行时,GUI 框架无法处理这些事件。因此,GUI 似乎被冻结了,因为它无法自行刷新。
一些工具包可能会在单独的线程中运行事件循环。 tkinter 和其他基于 python 的 GUI 框架可能不是这种情况。使用 tkinter,在某些平台上,需要在创建小部件的同一线程中运行事件循环。在 OSX 上,这是一个严格的要求。
如果您需要在 GUI 程序或任何长时间运行的函数中创建自己的循环,最好为任何此类代码创建一个单独的线程。