tcl - TK spinbox 进入更新 GUI 的无限循环
问题描述
我无法修复spinbox
. 具体来说,我需要在更改旋转框的值时通过它-command
和update
在其中更新 GUI。
稍微简化的代码如下:
package require Tk
set sv 1
ttk::spinbox .sp -from 1 -to 9 -textvariable ::sv \
-command {
after 50 ;# some processing imitated
puts [incr ::tmp]:$::sv ;# changes shown in CLI - ok
update ;# changes shown in GUI - ???
}
pack .sp
问题是当单击旋转框的箭头(更多“向上”而不是“向下”,但我没有发现任何规律性)然后按下 10-20 秒时,旋转框进入无限循环更新,如图puts
所示.
当然,原因update
在-command
代码中,但我不能没有它。
在 Windows (Tk 8.6.8) 和 Linux (Tk 8.6.10) 中尝试过,ttk::spinbox
并且spinbox
,所有这些都暴露了怪胎。
有什么办法可以克服这个吗?非常感谢您的帮助。
解决方案
我用视频制作了这个存档,update
以演示当包含在其-command
选项中时 spinbox 的奇怪行为。
存档中有两个测试:
test1.tcl提出了一种不应该这样做的方法。有两个问题:
-command
代码未移至单独的过程update
立即从-command
代码中触发
结果在test1-spx.mp4中看到:当按下旋转框箭头 10-20 秒时,旋转框进入无限循环更新。这种行为是不规则的,尽管当焦点切换到另一个应用程序时会很好地显示出来。
test2.tcl提供了一种克服这种怪癖的方法。after idle
用于推迟更新。您也可以after 0
为此使用。
在“真实测试” test2_pave.tcl 中,我使用以下过程-command
:
proc fontszCheck {} {
lappend ::afters [after 0 {
foreach a $::afters {after cancel $a}
set ::afters [list]
::t::toolBut 4 -3
}]
}
希望这些信息对处理 Tk spinbox 有用。
推荐阅读
- python - 如何获取模块 recipe.pipe?
- javascript - 当我点击一个按钮时,会出现相应的答案显示,其他答案不应该显示
- haskell - Haskell:在另一个非IO函数中使用IO函数中生成的列表
- c# - 在管理控制器中更新图像
- c# - 为什么 `dotnet new webapi` 为我创建的项目与其他人不同?
- usb - STM32 CDC字节传输
- java - 如何通过 JOOQ 中的复合主键选择多行?
- jqgrid-formatter - 带有hiperlink的jqGrid-cell列
- logging - EMR:如何在不使用 SSH 的情况下下载 Hive 日志?
- amazon-web-services - 如何设计一个 AWS IoT Analytics Pipeline,每个设备都有单独的数据集?