我有以下代码:
dialogproc = proc {
if (tree.focus_item)
per = Person.get(tree.focus_item)
dialog = persondialog(per, root)
dialog.set_focus()
dialog.grab()
dialog.transient(root)
per.save
end
}
在persondialog中我创建了一个TkToplevel。我想通过像Borlands OWL这样的Toolkits来使用它的方式是模态的,在那里对对话框进行控制,并且在关闭对话框后将保存人。在我的示例中,在显示对话框的同一时刻调用save。
除了那个对话框是非常模态的(你可以与窗口边界交互,但对我来说这没问题)。我已经使用tkwait进行了一些疯狂的测试(对于ruby用户来说相当没有文档)但没有成功。要么它根本不起作用,要么它提出了一些奇怪的tk错误消息,这些消息没有指向有用的方向。
我不确定我是否朝着正确的方向前进。我可以通过在persondialog中提供一个proc来解决我的问题,当调用保存按钮时调用它,如果需要,可以保存此人或执行其他操作。
或者从TopLevel继承一个必要的类?
您对最佳解决方案的建议如何?我希望对话框只对模型进行更改,而不是对数据库进行更改。这应该以某种方式独立完成。谢谢。
答案 0 :(得分:1)
您只能在屏幕上实际存在的窗口上设置抓取。尝试等待<Map>
或<Expose>
事件(仅暴露于Tk 8.5中的脚本级别)已发送到窗口(或更好的<Visibility>
事件,尽管他们'仅在通过X11渲染时才支持。
这将要求您将代码分成几个部分,其中一些部分在事件处理程序中;如果您希望代码的行为类似于同步调用(从“外部”的角度来看),那么您需要使用某种等待事件机制。这就是tkwait所做的,但我不太了解Ruby与Tk的耦合,以提供有关如何使其工作的建议。如果您可以通过在对话框中发出响应来调用回调,那么就可以更容易地集成,因为无论如何,Tk在内部的工作方式都是如此。
答案 1 :(得分:0)
我希望它是模态的
将控制权交给对话框[,],对话框关闭后将保存人员
如果模式对话框非常简单,则有可能使用
Tk.messageBox
。
自动地,这是一个模式窗口,并获得控制权。您还可以调用Tk.messageBox
的整个序列,从而获得一个人对一长串的是或否问题的答案。有关信息,请访问
Standard Dialogs
(在TkDocs教程中),然后滚动到“警报和确认对话框”部分。
如果您需要更通用的模式窗口, TkToplevel 确实是正确的方法。见章节 Creating and Destroying Windows 在教程中。
我可以通过在dialog中提供一个proc来解决我的问题,该过程在调用save按钮[,]时调用,如果需要,可以保存该人或执行其他操作
完全正确。
我已经用tkwait做了一些野性测试
当然,tkwait
涉及线程。相反,为什么不让人们在需要时单击非模态窗口呢?