使用Ruby / Tk创建模态对话框

时间:2012-03-20 15:27:36

标签: ruby dialog modal-dialog tk

我有以下代码:

  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继承一个必要的类?

您对最佳解决方案的建议如何?我希望对话框只对模型进行更改,而不是对数据库进行更改。这应该以某种方式独立完成。谢谢。

2 个答案:

答案 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涉及线程。相反,为什么不让人们在需要时单击非模态窗口呢?