我目前正在为neovim实现一个示例 UI ,并且由于平台的流行/简单性而决定使用 Tkinter/python。我遇到的问题是,当窗口高度超过某个阈值时,tkinter 似乎“堆叠”了 UI 更新。
这是一个显示问题的视频。
右侧窗口是运行neovim的终端模拟器,左侧窗口是与其连接的Tkinter UI程序。这个想法是 tkinter UI 应该反映 neovim 终端屏幕,包括尺寸。在此视频中,从不将焦点从终端窗口移开,因此 Tk 必须处理的唯一事件来自与 neovim 的连接(描述屏幕更新的虚拟“nvim”事件)
视频的第一部分显示当窗口高度较小时一切正常,但当我增加高度时开始滞后更新。
这是 Tkinter 程序的代码。虽然 neovim API 非常新并且仍在大量开发中(代码可能对某些读者没有意义),但我认为我要解决的问题接近于实现终端仿真器(使用 Tk 文本小部件):它必须处理大型有效地更新格式化文本的爆发。
我在 GUI 编程方面非常缺乏经验。Tkinter 是完成这项任务的明智选择吗?如果是的话,那么有人可以给我一个提示我做错了什么吗?
解释一下发生了什么:Neovim API 是线程安全的,并且该vim.next_event()
方法阻塞(没有忙等待,它使用下面的 libuv 事件循环)直到收到事件。
当vim.next_event()
调用返回时,它将使用 通知 Tkinter 线程generate_event
,该线程将执行实际的事件处理(它还缓冲事件之间的事件redraw:start
并redraw:stop
优化屏幕更新)。
所以实际上有两个事件循环并行运行,后台事件循环以线程安全的方式提供 Tkinter 事件循环(该generate_event
方法是少数可以从其他线程调用的方法之一)