RGTK2阻塞用户输入,同时处理其解释如何使用RGTK2阻塞用户输入,但我不知道如何将该代码添加到我的GUI代码中,我使用tcltk。我想要的和RGTK2一样,在处理时阻塞用户输入,但使用tcltk2
我使用这段代码运行按钮"过滤器集群"和命令功能是过滤器(函数做某事)
tkpack(tkbutton(f4, text='Filter Cluster', command=filter), side='left',padx= 5, pady = 20)
在tcltk
中,您将在无响应的窗口上使用tkgrab.set
,在对<Key>
事件有绑定的窗口上使用tkfocus
,以防止进一步处理。一个不显眼的tkframe
对于这类事情来说是很好的——将它的大小设置为1×1,但要确保它在屏幕上——因为它没有默认的行为来阻碍。(您还需要进行一些修饰性更改,例如将小部件标记为禁用并将光标设置为watch
。)在8.6中,有tk busy
(调用tcl("tk","busy",…)
,因为Tcl的tk
命令似乎没有一个方便的映射),这使得这一切变得更容易(尽管我不知道它是否/如何映射到R中)。释放抓取窗口的最简单方法是销毁它,但你也可以tkgrab.release
。
不要使用全局抓取。 它们很容易出错,会给你带来很多痛苦。(如果您坚持,强烈建议您取消鼠标活动,并非常彻底地进行测试。锁定显示器可不是一种愉快的体验!)默认的本地抓取不是问题,因为你可以切换到另一个程序,并在必要时杀死卡住的应用程序。
Tk(和Tcl)的完整文档在线;根据您正在使用的库的版本选择文档的版本,可能是8.5,希望是8.6(因为它有一些不错的额外功能),可能是8.4(老派!)正如tcltk
的R文档所述,您可以通过tcl(…)
调用Tcl或Tk中的任何内容,将命令名和参数的单词作为许多字符串传入(Tcl是一种天然的var-args语言,并且广泛使用这种语言)。默认便利映射的有限范围不应该对您造成实质性的阻碍。
一般性建议,与你的问题不太密切相关
大多数Tk程序员在编写代码时尽量不以这种方式锁定用户。如果您可以保持GUI响应性,而不是暂时禁用(通过大多数响应性小部件上的state
选项)可能在持续时间内触发重入问题的部分,您将获得更好的用户体验。(长时间运行的处理也可能是事件驱动的,或者放在另一个线程中,甚至委托给子流程。请记住,Tk GUI是严格的单线程-实现非常深入地假设了这一点,尽管可以在不同的线程中拥有完全独立的应用程序,如果要正确工作相当麻烦-所以您必须回到GUI线程来更新GUI中的任何内容