(Tcl/Tk) 创建持久性选项 window?

(Tcl/Tk) Creating a persistent options window?

计算器溢出!

我的问题分为两部分;第一部分是我不知道这个概念到底叫什么,这就是为什么我在任何地方都很难找到它!第二部分是我不确定它会如何在 Tcl/Tk 中实现。开始了...

那么,如何通过单击 "cancel" 或 [=22= 来完成您在 window 中正在做的事情的持久性 "settings" 顶层之一呢? ] 在你可以 return 到主 GUI 之前?我知道我可以给 window topmost 属性和 wm attributes 这将使 window 位于其他 window 之上,但这并不完全是我想。

要在 Tk 中制作模态对话框,您需要设置 grab 以便将鼠标事件定向到对话框 window。您可能还需要确保 focus 位于对话框中的某处。 (不要使用全局抓取 — grab -global — 除非您知道自己在做什么并且非常小心;您可以锁定整个 GUI 以防止用户与之交互。您 不应该 对模态对话框使用全局抓取。)

只能在映射的 windows 上设置抓取。在 Unix 上,tkwait visible 命令非常适合让事情暂时暂停,直到 window 实际映射。在 Windows 和 OSX 上,虽然适当的 after 可以提供很多帮助,但它并没有真正起作用,就像第一次观察 <Expose> 事件被处理一样(这实际 对话框的绘制被推迟到什么)。

您可能还想查看使用 tkwait variable (a.k.a., vwait) 以便您可以在代码中以阻塞方式使用对话框;您只需从 OKCancel 按钮设置(全局!)变量。这不是必需的,但它是一种相当常见的模式。如果这样做,请确保如果用户只是通过单击其 X window 装饰关闭对话框,您仍然会终止等待。 <Destroy> 事件对此很有用(尽管要小心在任何顶层捕获 <Destroy>;它还会检测子部件的破坏)。

最后,开始研究如何做到这一点的合理起点是 Tk 自己的 tk_dialog command. It's just a procedure, so you can read the source easily. Or you can look online (particularly check from line 148 onwards). The procedures it calls are all in tk.tcl