- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在为 neovim 实现一个示例 UI ,由于流行/简单,决定使用 Tkinter/python平台。我遇到的问题是 tkinter 似乎“堆叠”当窗口高度超过特定阈值时,UI 会更新。
Here是显示问题的视频。
右边的窗口是运行 neovim 的终端模拟器,左边的window 是连接到它的 Tkinter UI 程序。这个想法是tkinter UI 应该镜像 neovim 终端屏幕,包括方面。在这个视频中,永远不要把注意力从终端窗口,因此 Tk 必须处理的唯一事件来自连接到 neovim(描述屏幕的虚拟“nvim”事件更新)
视频的第一部分显示一切正常窗口高度很小,但当我增加时开始滞后更新高度。
Here是 Tkinter 程序的代码。虽然 neovim API 非常新并且仍在大量开发中(代码对某些读者来说可能没有意义),但我认为我要解决的问题接近于实现终端模拟器(使用 Tk 文本小部件):它必须有效地处理大量的格式化文本更新。
我在 GUI 编程方面非常缺乏经验。 Tkinter 是一个明智的选择吗?这个任务?如果是,那么有人可以提示我做错了什么吗?
稍微解释一下发生了什么:Neovim API 是线程安全的,vim.next_event()
方法会阻塞(无需忙等待,它在底层使用 libuv 事件循环)直到事件发生收到。
当 vim.next_event()
调用返回时,它将使用 generate_event
通知 Tkinter 线程,这将进行实际的事件处理(它还在 之间缓冲事件code>redraw:start
和 redraw:stop
以优化屏幕更新)。
所以实际上有两个并行运行的事件循环,后台事件循环以线程安全的方式提供给 Tkinter 事件循环(generate_event
方法是为数不多的可以调用的方法之一来自其他线程)
最佳答案
我会仔细检查,事实上,Tkinter 才是阻碍。我这样做的方法是在收到事件时简单地写到终端。
但现在我仔细看看这可能是你的问题:
t = Thread(target=get_nvim_events, args=(self.nvim_events,
self.vim,
self.root,))
线程不能很好地与事件循环一起使用——Tkinter 已经有一个。我不确定 neovim api 是否设置为使用回调,但这通常是您想要传播更改的方式。
既然您说您不熟悉 GUI 编程,那么我假设您不熟悉事件循环的概念。基本上,假设您有一些如下所示的代码:
while True:
if something_to_do:
do_it_now()
显然这是一个繁忙的循环,会消耗你的 CPU,所以通常你的事件循环会阻止或设置操作系统的回调,这允许它放弃 CPU,当一些有趣的事情发生时,操作系统会说这样的话,“有人点击了这里”或“有人按下了某个键”或“嘿,你让我现在叫醒你!”
因此,作为 GUI 开发人员,您的工作就是插入该事件循环。您并不真正关心何时某事发生 - 您只是想对其做出回应。使用 Tkinter,您可以使用 .after
方法来做到这一点 see "non-event callbacks" . .after_idle
method 可能是一个不错的选择:
Registers a callback that is called when the system is idle. The callback will be called there are no more events to process in the mainloop. The callback is only called once for each call to after_idle.
这意味着您不会阻止按键或鼠标点击,它只会在 Tkinter 处理完其他内容(例如绘图、调用回调等)后运行
我预计可能发生的情况是您的线程和主循环出现问题(可能是由于 GIL)。我环顾四周,但没有立即看到任何明显的东西,但你想要做的是:
def do_something(arg):
# do something with `arg` here
def event_happened(event_args): #whatever args the event generates
root.after_idle(lambda: do_something(event_args))
vim.bind("did_something", event_happened)
当然,您也可以完全绕过事件循环,让事件执行您想要的操作。
关于python - 为什么 Tkinter 文本小部件 "lags"会更新以增加窗口高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24292825/
我想向一些用户公开一个 Web 部件,但不是所有用户。如何在“添加 Web 部件”弹出窗口中显示或隐藏 Web 部件?我想通过代码来做到这一点,我希望使用 SharePoint 角色来实现这一点。 最
我无法创建两个以上的 StatusBar 部分: HWND hStatusBar = CreateWindowEx(0, STATUSCLASSNAME, "", WS_CHILD | WS_VISI
使用 SharePoint 2007,如何在编辑页面模式下允许将 CEWP 添加到“添加 Web 部件”对话框的选择菜单?目前,我只能添加公告、日历、链接、共享文档、任务,但我无法添加 CEWP。我可
哪个 Web 部件以及如何配置它以查看来自不同网站集的列表? 请注意,我不想查看页面,而是查看列表。例如,在单独的网站集下查看来自不同团队网站的公告。 预先感谢您的帮助。 最佳答案 Data Form
以下是我在 FeatureDeactivation 事件处理程序中添加的代码片段。我无法获得删除 System.Web.UI.WebControls.WebParts 类型的 webpart 的解决方
我一直在尝试跟踪来自以下方面的信息: Long URL clipped to stop breaking the page 和 http://msdn.microsoft.com/en-us/libr
我想创建一个自定义 Web 部件,它具有 1 个以上的筛选器 Web 部件,并且可以在运行时/设计时连接到报表查看器 Web 部件(集成模式)。 我为此搜索了很多,但找不到一种方法来让单个 Web 部
我正在尝试创建一个 Web 部件,使用户无需离开 AllItems.aspx 页面即可编辑项目。 Web 部件应具有与 EditForm.aspx 页面类似的功能。 我已经使用 ConnectionC
这些年发布的许多应用程序都有新的 GUI 部件。iTunes 或 Twitter.app 中垂直布局的最小、最大和关闭按钮(但最新的具有默认布局),Safari 和终端中的选项卡控件,GarageBa
在具有数据库依赖性的 WSS3 或 MOSS2007 中部署 Web 部件的最佳方法是什么? .wsp 是否应该包含创建数据库的代码,我应该将 .wsp 封装在另一个处理数据库创建的安装程序中,还是应
我在我们位于 http://sharepoint:12345 的 moss 服务器上创建了一个新的共享点站点并毫无问题地向其添加了 CQWP。 我有一个指向同一台服务器的域名。所以我指向了http:/
在官方 Office 2007 站点中有许多对筛选器 Web 部件的引用。当我尝试添加其中之一时,我的 Sharepoint 中的 Web 部件列表没有显示任何筛选器 Web 部件。 如果有人遇到相同
我被要求在 Sharepoint 中创建一个 Web 部件,列出用户在网站集中访问的最后 10 个文档。 我的客户想要一种快速的方式让用户访问文档,这样他们就不必翻遍文件夹结构来查找文档,因为大多数时
我需要使用 C# 以编程方式将 SharePoint Web 部件“站点用户”添加到页面。 我知道如何添加 Web 部件,但如何从 Share Point 获取“站点用户”Web 部件?我不知道如何实
我正在使用 MEF 在我的应用程序中加载插件。一切正常,但我希望在将新部件放入我的应用程序文件夹时发现它们。这可能吗? DirectoryCatalog 有一个 Changed 事件,但我不确定它是如
我有一个 Winforms 桌面应用程序正在加载具有相同接口(interface)类型的多个 MEF 部件。 问题:当我尝试加载多个相同类型时,出现以下异常: 组成保持不变。由于以下错误,更改被拒绝:
我有一个内容查询 Web 部件,它按内容类型对网站集进行查询。我已按内容类型对其进行了分组,因此我有: -- Agenda (Content Type) ----Agenda #1 ----Agend
考虑以下 SharePoint 站点层次结构: - Site Collection - Site1 - Subsite1 - AnotherSubsite1
好吧,在我的 SharePoint (2013) 网站中,我制作了一个简单的 JavaScript Web 部件,每五分钟刷新一次页面。我去调整时间,在刷新前输入等待时间的地方退格,然后不假思索地退出
我不知道 Sharepoint 脚本,我的同事也不知道 JavaScript。他使用了他在 http://www.wonderlaura.com/Lists/Posts/Post.aspx?ID=22
我是一名优秀的程序员,十分优秀!