RGTK2 block user input while processing它解释了如何使用RGTK2阻止用户输入,但我不知道如何将该代码添加到我的GUI代码中,我使用tcltk。我想要的是RGTK2 block user input while processing但是使用tcltk2
我使用此代码运行按钮“过滤器集群”,命令功能是过滤器(功能做某事)
tkpack(tkbutton(f4, text='Filter Cluster', command=filter), side='left',padx= 5, pady = 20)
答案 0 :(得分:1)
在tcltk
中,您将在非响应窗口上使用tkgrab.set
,在tkfocus
事件上具有绑定功能阻止进一步处理的窗口上使用<Key>
。一个不起眼的tkframe
对于那种事情很有用 - 将其设置为1×1大小,但确保它在屏幕上 - 因为它没有默认行为阻碍。 (您还需要进行一系列修饰,例如将窗口小部件标记为已禁用并将光标设置为watch
。)在8.6中,tk busy
(使用tcl("tk","busy",…)
调用因为Tcl tk
命令似乎没有方便的映射,这使得这一切变得更加容易(虽然我不知道是否/如何映射到R)。释放抓取窗口的最简单方法是销毁它,但您也可以tkgrab.release
。
不要使用全局抓取。 他们很容易出错并且可能会让您感到悲伤。 (如果你坚持,强烈建议你让鼠标活动取消它并且非常彻底地测试。锁定显示器并不是一种愉快的体验!)默认的本地抓取不是问题,因为你可以切换到另一个程序,并在必要时杀死一个卡住的应用程序。
Tk(和Tcl)的完整文档是online;选择你正在使用的库版本的文档版本,可能是8.5,希望8.6('它有一些很好的附加功能)和可能8.4(旧skool!)作为tcltk
的R文档说,你可以通过tcl(…)
在Tcl或Tk中调用任何东西,传递命令名和参数的字数为多个字符串......(Tcl是一种自然的var-args语言并广泛使用它。)范围有限默认的便利贴图不应该在实质上妨碍你。
大多数Tk程序员尝试编写代码,以便在可能的情况下不会以这种方式锁定用户。如果您可以保持GUI响应,而不是暂时禁用(通过大多数被动小部件上的state
选项)那些在此期间会触发重入问题的部分,您将获得更好的用户体验。 (长时间运行的处理也可能是事件驱动的,或者放在另一个线程中,甚至委托给子进程。请记住,Tk GUI 严格单线程 - 实现假设这个虽然可以在不同的线程中拥有完全独立的应用程序,但是如果相当毛茸茸才能正常工作 - 所以你必须回到GUI线程来更新GUI中的任何内容。)